Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds support for USING in JOIN clause #364

Merged
merged 1 commit into from
Mar 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/PHPSQLParser/processors/FromProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ protected function processFromExpression(&$parseInfo) {

// we have a reg_expr, so we have to parse it
if ($parseInfo['ref_expr'] !== false) {
$unparsed = $this->splitSQLIntoTokens($parseInfo['ref_expr']);
$unparsed = $this->splitSQLIntoTokens(trim($parseInfo['ref_expr']));

// here we can get a comma separated list
foreach ($unparsed as $k => $v) {
Expand Down
21 changes: 21 additions & 0 deletions tests/cases/creator/issue270Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace PHPSQLParser\Test\Creator;
use PHPSQLParser\PHPSQLParser;
use PHPSQLParser\PHPSQLCreator;

class issue270Test extends \PHPUnit\Framework\TestCase
{
public function testIssue319()
{
$sql = 'SELECT * FROM table1 LEFT JOIN table2 USING (id1) LEFT JOIN table3 USING(id2) LEFT JOIN table4 ON table3.id3 = table4.id3';
$createdSql = 'SELECT * FROM table1 LEFT JOIN table2 USING (id1) LEFT JOIN table3 USING (id2) LEFT JOIN table4 ON table3.id3 = table4.id3';

$parser = new PHPSQLParser();
$creator = new PHPSQLCreator();

$parser->parse($sql, true);

$this->assertEquals($createdSql, $creator->create($parser->parsed));
}
}
2 changes: 1 addition & 1 deletion tests/expected/parser/left2.serialized
Original file line number Diff line number Diff line change
@@ -1 +1 @@
a:2:{s:6:"SELECT";a:3:{i:0;a:6:{s:9:"expr_type";s:6:"colref";s:5:"alias";b:0;s:9:"base_expr";s:8:"a.field1";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"a";i:1;s:6:"field1";}}s:8:"sub_tree";b:0;s:5:"delim";s:1:",";}i:1;a:6:{s:9:"expr_type";s:6:"colref";s:5:"alias";b:0;s:9:"base_expr";s:8:"b.field1";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"b";i:1;s:6:"field1";}}s:8:"sub_tree";b:0;s:5:"delim";s:1:",";}i:2;a:6:{s:9:"expr_type";s:6:"colref";s:5:"alias";b:0;s:9:"base_expr";s:8:"c.field1";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"c";i:1;s:6:"field1";}}s:8:"sub_tree";b:0;s:5:"delim";b:0;}}s:4:"FROM";a:7:{i:0;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:6:"tablea";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:6:"tablea";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:1:"a";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"a";}}s:9:"base_expr";s:1:"a";}s:5:"hints";b:0;s:9:"join_type";s:4:"JOIN";s:8:"ref_type";b:0;s:10:"ref_clause";b:0;s:9:"base_expr";s:8:"tablea a";s:8:"sub_tree";b:0;}i:1;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:6:"tableb";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:6:"tableb";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:1:"b";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"b";}}s:9:"base_expr";s:1:"b";}s:5:"hints";b:0;s:9:"join_type";s:4:"LEFT";s:8:"ref_type";s:2:"ON";s:10:"ref_clause";a:3:{i:0;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:5:"b.ida";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"b";i:1;s:3:"ida";}}s:8:"sub_tree";b:0;}i:1;a:3:{s:9:"expr_type";s:8:"operator";s:9:"base_expr";s:1:"=";s:8:"sub_tree";b:0;}i:2;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:4:"a.id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"a";i:1;s:2:"id";}}s:8:"sub_tree";b:0;}}s:9:"base_expr";s:24:"tableb b ON b.ida = a.id";s:8:"sub_tree";b:0;}i:2;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:6:"tablec";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:6:"tablec";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:1:"c";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"c";}}s:9:"base_expr";s:1:"c";}s:5:"hints";b:0;s:9:"join_type";s:5:"RIGHT";s:8:"ref_type";s:2:"ON";s:10:"ref_clause";a:3:{i:0;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:5:"c.idb";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"c";i:1;s:3:"idb";}}s:8:"sub_tree";b:0;}i:1;a:3:{s:9:"expr_type";s:8:"operator";s:9:"base_expr";s:1:"=";s:8:"sub_tree";b:0;}i:2;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:4:"b.id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"b";i:1;s:2:"id";}}s:8:"sub_tree";b:0;}}s:9:"base_expr";s:24:"tablec c ON c.idb = b.id";s:8:"sub_tree";b:0;}i:3;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:6:"tabled";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:6:"tabled";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:1:"d";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"d";}}s:9:"base_expr";s:1:"d";}s:5:"hints";b:0;s:9:"join_type";s:4:"JOIN";s:8:"ref_type";s:5:"USING";s:10:"ref_clause";a:1:{i:0;a:3:{s:9:"expr_type";s:11:"column-list";s:9:"base_expr";s:1:" ";s:8:"sub_tree";a:1:{i:0;a:3:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:0:"";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:0:{}}}}}}s:9:"base_expr";s:21:"tabled d USING (d_id)";s:8:"sub_tree";b:0;}i:4;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:1:"e";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"e";}}s:5:"alias";b:0;s:5:"hints";b:0;s:9:"join_type";s:5:"RIGHT";s:8:"ref_type";s:2:"ON";s:10:"ref_clause";a:3:{i:0;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:4:"e.id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"e";i:1;s:2:"id";}}s:8:"sub_tree";b:0;}i:1;a:3:{s:9:"expr_type";s:8:"operator";s:9:"base_expr";s:1:"=";s:8:"sub_tree";b:0;}i:2;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:6:"a.e_id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"a";i:1;s:4:"e_id";}}s:8:"sub_tree";b:0;}}s:9:"base_expr";s:18:"e on e.id = a.e_id";s:8:"sub_tree";b:0;}i:5;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:1:"e";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"e";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:2:"e2";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:2:"e2";}}s:9:"base_expr";s:2:"e2";}s:5:"hints";b:0;s:9:"join_type";s:4:"LEFT";s:8:"ref_type";s:5:"USING";s:10:"ref_clause";a:1:{i:0;a:3:{s:9:"expr_type";s:11:"column-list";s:9:"base_expr";s:1:" ";s:8:"sub_tree";a:1:{i:0;a:3:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:0:"";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:0:{}}}}}}s:9:"base_expr";s:17:"e e2 using (e_id)";s:8:"sub_tree";b:0;}i:6;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:1:"e";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"e";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:2:"e3";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:2:"e3";}}s:9:"base_expr";s:2:"e3";}s:5:"hints";b:0;s:9:"join_type";s:4:"JOIN";s:8:"ref_type";s:2:"ON";s:10:"ref_clause";a:1:{i:0;a:3:{s:9:"expr_type";s:18:"bracket_expression";s:9:"base_expr";s:19:"(e3.e_id = e2.e_id)";s:8:"sub_tree";a:3:{i:0;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:7:"e3.e_id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:2:"e3";i:1;s:4:"e_id";}}s:8:"sub_tree";b:0;}i:1;a:3:{s:9:"expr_type";s:8:"operator";s:9:"base_expr";s:1:"=";s:8:"sub_tree";b:0;}i:2;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:7:"e2.e_id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:2:"e2";i:1;s:4:"e_id";}}s:8:"sub_tree";b:0;}}}}s:9:"base_expr";s:27:"e e3 on (e3.e_id = e2.e_id)";s:8:"sub_tree";b:0;}}}
a:2:{s:6:"SELECT";a:3:{i:0;a:6:{s:9:"expr_type";s:6:"colref";s:5:"alias";b:0;s:9:"base_expr";s:8:"a.field1";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"a";i:1;s:6:"field1";}}s:8:"sub_tree";b:0;s:5:"delim";s:1:",";}i:1;a:6:{s:9:"expr_type";s:6:"colref";s:5:"alias";b:0;s:9:"base_expr";s:8:"b.field1";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"b";i:1;s:6:"field1";}}s:8:"sub_tree";b:0;s:5:"delim";s:1:",";}i:2;a:6:{s:9:"expr_type";s:6:"colref";s:5:"alias";b:0;s:9:"base_expr";s:8:"c.field1";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"c";i:1;s:6:"field1";}}s:8:"sub_tree";b:0;s:5:"delim";b:0;}}s:4:"FROM";a:7:{i:0;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:6:"tablea";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:6:"tablea";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:1:"a";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"a";}}s:9:"base_expr";s:1:"a";}s:5:"hints";b:0;s:9:"join_type";s:4:"JOIN";s:8:"ref_type";b:0;s:10:"ref_clause";b:0;s:9:"base_expr";s:8:"tablea a";s:8:"sub_tree";b:0;}i:1;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:6:"tableb";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:6:"tableb";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:1:"b";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"b";}}s:9:"base_expr";s:1:"b";}s:5:"hints";b:0;s:9:"join_type";s:4:"LEFT";s:8:"ref_type";s:2:"ON";s:10:"ref_clause";a:3:{i:0;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:5:"b.ida";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"b";i:1;s:3:"ida";}}s:8:"sub_tree";b:0;}i:1;a:3:{s:9:"expr_type";s:8:"operator";s:9:"base_expr";s:1:"=";s:8:"sub_tree";b:0;}i:2;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:4:"a.id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"a";i:1;s:2:"id";}}s:8:"sub_tree";b:0;}}s:9:"base_expr";s:24:"tableb b ON b.ida = a.id";s:8:"sub_tree";b:0;}i:2;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:6:"tablec";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:6:"tablec";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:1:"c";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"c";}}s:9:"base_expr";s:1:"c";}s:5:"hints";b:0;s:9:"join_type";s:5:"RIGHT";s:8:"ref_type";s:2:"ON";s:10:"ref_clause";a:3:{i:0;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:5:"c.idb";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"c";i:1;s:3:"idb";}}s:8:"sub_tree";b:0;}i:1;a:3:{s:9:"expr_type";s:8:"operator";s:9:"base_expr";s:1:"=";s:8:"sub_tree";b:0;}i:2;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:4:"b.id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"b";i:1;s:2:"id";}}s:8:"sub_tree";b:0;}}s:9:"base_expr";s:24:"tablec c ON c.idb = b.id";s:8:"sub_tree";b:0;}i:3;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:6:"tabled";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:6:"tabled";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:1:"d";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"d";}}s:9:"base_expr";s:1:"d";}s:5:"hints";b:0;s:9:"join_type";s:4:"JOIN";s:8:"ref_type";s:5:"USING";s:10:"ref_clause";a:1:{i:0;a:3:{s:9:"expr_type";s:11:"column-list";s:9:"base_expr";s:6:"(d_id)";s:8:"sub_tree";a:1:{i:0;a:3:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:4:"d_id";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:4:"d_id";}}}}}}s:9:"base_expr";s:21:"tabled d USING (d_id)";s:8:"sub_tree";b:0;}i:4;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:1:"e";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"e";}}s:5:"alias";b:0;s:5:"hints";b:0;s:9:"join_type";s:5:"RIGHT";s:8:"ref_type";s:2:"ON";s:10:"ref_clause";a:3:{i:0;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:4:"e.id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"e";i:1;s:2:"id";}}s:8:"sub_tree";b:0;}i:1;a:3:{s:9:"expr_type";s:8:"operator";s:9:"base_expr";s:1:"=";s:8:"sub_tree";b:0;}i:2;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:6:"a.e_id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:1:"a";i:1;s:4:"e_id";}}s:8:"sub_tree";b:0;}}s:9:"base_expr";s:18:"e on e.id = a.e_id";s:8:"sub_tree";b:0;}i:5;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:1:"e";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"e";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:2:"e2";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:2:"e2";}}s:9:"base_expr";s:2:"e2";}s:5:"hints";b:0;s:9:"join_type";s:4:"LEFT";s:8:"ref_type";s:5:"USING";s:10:"ref_clause";a:1:{i:0;a:3:{s:9:"expr_type";s:11:"column-list";s:9:"base_expr";s:6:"(e_id)";s:8:"sub_tree";a:1:{i:0;a:3:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:4:"e_id";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:4:"e_id";}}}}}}s:9:"base_expr";s:17:"e e2 using (e_id)";s:8:"sub_tree";b:0;}i:6;a:10:{s:9:"expr_type";s:5:"table";s:5:"table";s:1:"e";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:1:"e";}}s:5:"alias";a:4:{s:2:"as";b:0;s:4:"name";s:2:"e3";s:9:"no_quotes";a:2:{s:5:"delim";b:0;s:5:"parts";a:1:{i:0;s:2:"e3";}}s:9:"base_expr";s:2:"e3";}s:5:"hints";b:0;s:9:"join_type";s:4:"JOIN";s:8:"ref_type";s:2:"ON";s:10:"ref_clause";a:1:{i:0;a:3:{s:9:"expr_type";s:18:"bracket_expression";s:9:"base_expr";s:19:"(e3.e_id = e2.e_id)";s:8:"sub_tree";a:3:{i:0;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:7:"e3.e_id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:2:"e3";i:1;s:4:"e_id";}}s:8:"sub_tree";b:0;}i:1;a:3:{s:9:"expr_type";s:8:"operator";s:9:"base_expr";s:1:"=";s:8:"sub_tree";b:0;}i:2;a:4:{s:9:"expr_type";s:6:"colref";s:9:"base_expr";s:7:"e2.e_id";s:9:"no_quotes";a:2:{s:5:"delim";s:1:".";s:5:"parts";a:2:{i:0;s:2:"e2";i:1;s:4:"e_id";}}s:8:"sub_tree";b:0;}}}}s:9:"base_expr";s:27:"e e3 on (e3.e_id = e2.e_id)";s:8:"sub_tree";b:0;}}}