Skip to content

Commit f151567

Browse files
committed
Add more tests
Signed-off-by: Deven Bansod <[email protected]>
1 parent 30d1710 commit f151567

13 files changed

+84
-25
lines changed

src/Components/CaseExpression.php

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,6 @@ public static function parse(Parser $parser, TokensList $list, array $options =
105105
*/
106106
$token = $list->tokens[$list->idx];
107107

108-
// End of statement.
109-
if ($token->type === Token::TYPE_DELIMITER) {
110-
break;
111-
}
112-
113108
// Skipping whitespaces and comments.
114109
if (($token->type === Token::TYPE_WHITESPACE)
115110
|| ($token->type === Token::TYPE_COMMENT)
@@ -172,9 +167,6 @@ public static function parse(Parser $parser, TokensList $list, array $options =
172167
} elseif ($token->type === Token::TYPE_KEYWORD) {
173168
$parser->error(__('Unexpected keyword.'), $token);
174169
break;
175-
} else {
176-
$parser->error(__('Unexpected token.'), $token);
177-
break;
178170
}
179171
} else {
180172
if ($token->type === Token::TYPE_KEYWORD
@@ -187,9 +179,6 @@ public static function parse(Parser $parser, TokensList $list, array $options =
187179
} elseif ($token->type === Token::TYPE_KEYWORD) {
188180
$parser->error(__('Unexpected keyword.'), $token);
189181
break;
190-
} else {
191-
$parser->error(__('Unexpected token.'), $token);
192-
break;
193182
}
194183
}
195184
} elseif ($state === 2) {
@@ -204,9 +193,6 @@ public static function parse(Parser $parser, TokensList $list, array $options =
204193
} elseif ($token->type === Token::TYPE_KEYWORD) {
205194
$parser->error(__('Unexpected keyword.'), $token);
206195
break;
207-
} else {
208-
$parser->error(__('Unexpected token.'), $token);
209-
break;
210196
}
211197
}
212198
}
@@ -238,7 +224,7 @@ public static function build($component, array $options = array())
238224
for (
239225
$i = 0;
240226
$i < count($component->compare_values) && $i < count($component->results);
241-
$i++
227+
++$i
242228
) {
243229
$ret .= 'WHEN ' . $component->compare_values[$i] . ' ';
244230
$ret .= 'THEN ' . $component->results[$i] . ' ';
@@ -248,7 +234,7 @@ public static function build($component, array $options = array())
248234
for (
249235
$i = 0;
250236
$i < count($component->conditions) && $i < count($component->results);
251-
$i++
237+
++$i
252238
) {
253239
$ret .= 'WHEN ' . Condition::build($component->conditions[$i]) . ' ';
254240
$ret .= 'THEN ' . $component->results[$i] . ' ';

tests/Components/CaseExpressionTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,56 @@ public function testParseBuild2()
3333
'CASE WHEN 1=1 THEN "India" ELSE "Other" END'
3434
);
3535
}
36+
37+
public function testParseBuild3()
38+
{
39+
$caseExprQuery = 'case 1 when 1 then "Some" '
40+
. 'when 2 then "SomeOther" else "Other" end';
41+
$component = CaseExpression::parse(
42+
new Parser(),
43+
$this->getTokensList($caseExprQuery));
44+
$this->assertEquals(
45+
CaseExpression::build($component),
46+
'CASE 1 WHEN 1 THEN "Some" WHEN 2 THEN "SomeOther" ELSE "Other" END'
47+
);
48+
}
49+
50+
public function testParseBuild4()
51+
{
52+
$caseExprQuery = 'case 1 when 1 then "Some" '
53+
. 'when 2 then "SomeOther" end';
54+
$component = CaseExpression::parse(
55+
new Parser(),
56+
$this->getTokensList($caseExprQuery));
57+
$this->assertEquals(
58+
CaseExpression::build($component),
59+
'CASE 1 WHEN 1 THEN "Some" WHEN 2 THEN "SomeOther" END'
60+
);
61+
}
62+
63+
public function testParseBuild5()
64+
{
65+
$caseExprQuery = 'case when 1=1 then "Some" '
66+
. 'when 1=2 then "SomeOther" else "Other" end';
67+
$component = CaseExpression::parse(
68+
new Parser(),
69+
$this->getTokensList($caseExprQuery));
70+
$this->assertEquals(
71+
CaseExpression::build($component),
72+
'CASE WHEN 1=1 THEN "Some" WHEN 1=2 THEN "SomeOther" ELSE "Other" END'
73+
);
74+
}
75+
76+
public function testParseBuild6()
77+
{
78+
$caseExprQuery = 'case when 1=1 then "Some" '
79+
. 'when 1=2 then "SomeOther" end';
80+
$component = CaseExpression::parse(
81+
new Parser(),
82+
$this->getTokensList($caseExprQuery));
83+
$this->assertEquals(
84+
CaseExpression::build($component),
85+
'CASE WHEN 1=1 THEN "Some" WHEN 1=2 THEN "SomeOther" END'
86+
);
87+
}
3688
}

tests/Parser/SelectStatementTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,13 @@ public function testSelectProvider()
3535
array('parser/parseSelectNested'),
3636
array('parser/parseSelectCase1'),
3737
array('parser/parseSelectCase2'),
38+
array('parser/parseSelectCase3'),
39+
array('parser/parseSelectCase4'),
3840
array('parser/parseSelectCaseErr1'),
3941
array('parser/parseSelectCaseErr2'),
4042
array('parser/parseSelectCaseErr3'),
4143
array('parser/parseSelectCaseErr4'),
44+
array('parser/parseSelectCaseErr5'),
4245
);
4346
}
4447
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name,
2-
case when 1=1 then "Some" else "Other" end FROM a;
2+
case /* */ when 1=1 then "Some" else "Other" end FROM a;

tests/data/parser/parseSelectCase2.out

Lines changed: 4 additions & 4 deletions
Large diffs are not rendered by default.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name,
2+
case /* */ when 1=1 then "Some" when 2=1 then "Other" end FROM a;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
a:4:{s:5:"query";s:147:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name,
2+
case /* */ when 1=1 then "Some" when 2=1 then "Other" end FROM a;";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:147:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name,
3+
case /* */ when 1=1 then "Some" when 2=1 then "Other" end FROM a;";s:3:"len";i:147;s:4:"last";i:147;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:58:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"select";s:5:"value";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:7;}i:3;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"SELECT";s:5:"value";s:6:"SELECT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:8;}i:4;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:14;}i:5;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:15;}i:6;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:19;}i:7;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:20;}i:8;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:24;}i:9;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"mysql";s:5:"value";s:5:"mysql";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:25;}i:10;O:15:"SqlParser\Token":5:{s:5:"token";s:1:".";s:5:"value";s:1:".";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:30;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:13:"help_category";s:5:"value";s:13:"help_category";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:31;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:44;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"WHERE";s:5:"value";s:5:"WHERE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:45;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:50;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:16:"help_category_id";s:5:"value";s:16:"help_category_id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:51;}i:16;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:67;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:68;}i:18;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:69;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"1";s:5:"value";i:1;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:70;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:71;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:72;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"as";s:5:"value";s:2:"AS";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:73;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:75;}i:24;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"name";s:5:"value";s:4:"name";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:76;}i:25;O:15:"SqlParser\Token":5:{s:5:"token";s:1:",";s:5:"value";s:1:",";s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:80;}i:26;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"
4+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:81;}i:27;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"case";s:5:"value";s:4:"CASE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:82;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:86;}i:29;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"/* */";s:5:"value";s:5:"/* */";s:4:"type";i:4;s:5:"flags";i:2;s:8:"position";i:87;}i:30;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:92;}i:31;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:93;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:97;}i:33;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"1";s:5:"value";i:1;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:98;}i:34;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:99;}i:35;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"1";s:5:"value";i:1;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:100;}i:36;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:101;}i:37;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:102;}i:38;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:106;}i:39;O:15:"SqlParser\Token":5:{s:5:"token";s:6:""Some"";s:5:"value";s:4:"Some";s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:107;}i:40;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:113;}i:41;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"when";s:5:"value";s:4:"WHEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:114;}i:42;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:118;}i:43;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:119;}i:44;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"=";s:5:"value";s:1:"=";s:4:"type";i:2;s:5:"flags";i:2;s:8:"position";i:120;}i:45;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"1";s:5:"value";i:1;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:121;}i:46;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:122;}i:47;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"then";s:5:"value";s:4:"THEN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:123;}i:48;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:127;}i:49;O:15:"SqlParser\Token":5:{s:5:"token";s:7:""Other"";s:5:"value";s:5:"Other";s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:128;}i:50;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:135;}i:51;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"end";s:5:"value";s:3:"end";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:136;}i:52;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:139;}i:53;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"FROM";s:5:"value";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:140;}i:54;O:15:"SqlParser\Token":5:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:144;}i:55;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"a";s:5:"value";s:1:"a";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:145;}i:56;O:15:"SqlParser\Token":5:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:146;}i:57;O:15:"SqlParser\Token":5:{s:5:"token";N;s:5:"value";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:58;s:3:"idx";i:58;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":5:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:2:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:65:"(SELECT name FROM mysql.help_category WHERE help_category_id = 1)";s:5:"alias";s:4:"name";s:8:"function";N;s:8:"subquery";s:6:"SELECT";}i:1;O:35:"SqlParser\Components\CaseExpression":5:{s:5:"value";N;s:10:"conditions";a:2:{i:0;a:1:{i:0;O:30:"SqlParser\Components\Condition":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:0;s:4:"expr";s:3:"1=1";}}i:1;a:1:{i:0;O:30:"SqlParser\Components\Condition":3:{s:11:"identifiers";a:0:{}s:10:"isOperator";b:0;s:4:"expr";s:3:"2=1";}}}s:7:"results";a:2:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:4:"Some";s:4:"expr";s:6:""Some"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:1;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:5:"Other";s:4:"expr";s:7:""Other"";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:14:"compare_values";N;s:11:"else_result";N;}}s:4:"from";a:1:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:1:"a";s:6:"column";N;s:4:"expr";s:1:"a";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;s:9:"procedure";N;s:4:"into";N;s:4:"join";N;s:5:"union";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:5:"first";i:0;s:4:"last";i:55;}}s:8:"brackets";i:0;}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name,
2+
case 1 /* */ when 1 then "Some" when 2 then "Other" end FROM a;

0 commit comments

Comments
 (0)