Skip to content

Commit 9da8598

Browse files
committed
Fix some issue with error reports and added testcases
Signed-off-by: Deven Bansod <devenbansod.bits@gmail.com>
1 parent 7f4702a commit 9da8598

15 files changed

+82
-27
lines changed

src/Components/CaseExpression.php

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
use SqlParser\TokensList;
1616

1717

18-
19-
2018
/**
2119
* Parses a reference to a CASE expression
2220
*
@@ -83,20 +81,6 @@ public static function parse(Parser $parser, TokensList $list)
8381
{
8482
$ret = new CaseExpression();
8583

86-
/**
87-
* Counts brackets.
88-
*
89-
* @var int $brackets
90-
*/
91-
$brackets = 0;
92-
93-
/**
94-
* Keeps track of the last two previous tokens.
95-
*
96-
* @var Token[] $prev
97-
*/
98-
$prev = array(null, null);
99-
10084
/**
10185
* State of parser
10286
*
@@ -157,7 +141,7 @@ public static function parse(Parser $parser, TokensList $list)
157141
++$list->idx;
158142
break;
159143
} elseif ($token->type === Token::TYPE_KEYWORD) {
160-
$parser->error(__('Unexpected keyword'), $token);
144+
$parser->error(__('Unexpected keyword.'), $token);
161145
break;
162146
} else {
163147
$ret->value = Expression::parse($parser, $list);
@@ -187,10 +171,10 @@ public static function parse(Parser $parser, TokensList $list)
187171
++$list->idx;
188172
break;
189173
} elseif ($token->type === Token::TYPE_KEYWORD) {
190-
$parser->error(__('Unexpected keyword'), $token);
174+
$parser->error(__('Unexpected keyword.'), $token);
191175
break;
192176
} else {
193-
$parser->error(__('Unexpected token'), $token);
177+
$parser->error(__('Unexpected token.'), $token);
194178
break;
195179
}
196180
} else {
@@ -202,10 +186,10 @@ public static function parse(Parser $parser, TokensList $list)
202186
$state = 0;
203187
$ret->results[] = $new_result;
204188
} elseif ($token->type === Token::TYPE_KEYWORD) {
205-
$parser->error(__('Unexpected keyword'), $token);
189+
$parser->error(__('Unexpected keyword.'), $token);
206190
break;
207191
} else {
208-
$parser->error(__('Unexpected token'), $token);
192+
$parser->error(__('Unexpected token.'), $token);
209193
break;
210194
}
211195
}
@@ -219,23 +203,20 @@ public static function parse(Parser $parser, TokensList $list)
219203
$ret->results[] = $new_result;
220204
$state = 1;
221205
} elseif ($token->type === Token::TYPE_KEYWORD) {
222-
$parser->error(__('Unexpected keyword'), $token);
206+
$parser->error(__('Unexpected keyword.'), $token);
223207
break;
224208
} else {
225-
$parser->error(__('Unexpected token'), $token);
209+
$parser->error(__('Unexpected token.'), $token);
226210
break;
227211
}
228-
} else {
229-
$parser->error(__('Unexpected token'), $token);
230-
break;
231212
}
232213
}
233214
}
234215

235216
if ($state !== 3) {
236217
$parser->error(
237218
__('Unexpected end of CASE expression'),
238-
$list->list[$list->idx - 1]
219+
$list->tokens[$list->idx - 1]
239220
);
240221
}
241222

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace SqlParser\Tests\Components;
4+
5+
use SqlParser\Parser;
6+
use SqlParser\Components\CaseExpression;
7+
8+
use SqlParser\Tests\TestCase;
9+
10+
class CaseExpressionTest extends TestCase
11+
{
12+
13+
public function testParseBuild()
14+
{
15+
$caseExprQuery = 'case 1 when 1 then "Some" else "Other" end';
16+
$component = CaseExpression::parse(
17+
new Parser(),
18+
$this->getTokensList($caseExprQuery));
19+
$this->assertEquals(
20+
CaseExpression::build($component),
21+
'CASE 1 WHEN 1 THEN "Some" ELSE "Other" END'
22+
);
23+
}
24+
25+
public function testParseBuild2()
26+
{
27+
$caseExprQuery = 'case when 1=1 then "India" else "Other" end';
28+
$component = CaseExpression::parse(
29+
new Parser(),
30+
$this->getTokensList($caseExprQuery));
31+
$this->assertEquals(
32+
CaseExpression::build($component),
33+
'CASE WHEN 1=1 THEN "India" ELSE "Other" END'
34+
);
35+
}
36+
}

tests/Parser/SelectStatementTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ public function testSelectProvider()
3333
array('parser/parseSelect4'),
3434
array('parser/parseSelectErr1'),
3535
array('parser/parseSelectNested'),
36+
array('parser/parseSelectCase1'),
37+
array('parser/parseSelectCase2'),
38+
array('parser/parseSelectCaseErr1'),
39+
array('parser/parseSelectCaseErr2'),
40+
array('parser/parseSelectCaseErr3'),
41+
array('parser/parseSelectCaseErr4'),
3642
);
3743
}
3844
}
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" else "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:132:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name,
2+
case 1 when 1 then "Some" else "Other" end FROM a;";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:132:"select (SELECT name FROM mysql.help_category WHERE help_category_id = 1) as name,
3+
case 1 when 1 then "Some" else "Other" end FROM a;";s:3:"len";i:132;s:4:"last";i:132;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:50:{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:1:"1";s:5:"value";i:1;s:4:"type";i:6;s:5:"flags";i:0;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:88;}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:89;}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:93;}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:94;}i:34;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:95;}i:35;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:96;}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:100;}i:37;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:101;}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:107;}i:39;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"else";s:5:"value";s:4:"ELSE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:108;}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:112;}i:41;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:113;}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:120;}i:43;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:121;}i:44;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:124;}i:45;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:125;}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:129;}i:47;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:130;}i:48;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:131;}i:49;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:50;s:3:"idx";i:50;}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";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:10:"conditions";N;s:7:"results";a:1:{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;}}s:14:"compare_values";a:1:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"1";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:11:"else_result";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: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:47;}}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 when 1=1 then "Some" else "Other" end FROM a;

0 commit comments

Comments
 (0)