Skip to content

Commit 98679cb

Browse files
committed
Fixed some errors and add new tests
Signed-off-by: Deven Bansod <[email protected]>
1 parent 0fb198f commit 98679cb

33 files changed

+87
-46
lines changed

src/Components/Limit.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,6 @@ public static function parse(Parser $parser, TokensList $list, array $options =
127127
*/
128128
public static function build($component, array $options = array())
129129
{
130-
if (count($component->offset) === 0) {
131-
return (string) $component->rowCount;
132-
} else {
133-
return $component->offset . ', ' . $component->rowCount;
134-
}
130+
return $component->offset . ', ' . $component->rowCount;
135131
}
136132
}

src/Statements/DeleteStatement.php

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,13 @@ public function parse(Parser $parser, TokensList $list)
180180
*/
181181
$state = 0;
182182

183+
/**
184+
* If the query is multi-table or not
185+
*
186+
* @var bool $multiTable
187+
*/
188+
$multiTable = false;
189+
183190
for (; $list->idx < $list->count; ++$list->idx) {
184191
/**
185192
* Token parsed at this moment.
@@ -193,11 +200,6 @@ public function parse(Parser $parser, TokensList $list)
193200
break;
194201
}
195202

196-
// Skipping whitespaces and comments.
197-
if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) {
198-
continue;
199-
}
200-
201203
if ($state === 0) {
202204
if ($token->type === Token::TYPE_KEYWORD
203205
&& $token->value !== 'FROM'
@@ -226,9 +228,6 @@ public function parse(Parser $parser, TokensList $list)
226228
++$list->idx; // Skip 'FROM'
227229
$this->from = ExpressionArray::parse($parser, $list);
228230
$state = 2;
229-
} elseif ($token->type === Token::TYPE_KEYWORD) {
230-
$parser->error(__('Unexpected keyword.'), $token);
231-
break;
232231
} else {
233232
$parser->error(__('Unexpected token.'), $token);
234233
break;
@@ -237,9 +236,11 @@ public function parse(Parser $parser, TokensList $list)
237236
if ($token->type === Token::TYPE_KEYWORD
238237
&& $token->value === 'USING'
239238
) {
240-
++$list->idx; // Skip 'FROM'
239+
++$list->idx; // Skip 'USING'
241240
$this->using = ExpressionArray::parse($parser, $list);
242241
$state = 3;
242+
243+
$multiTable = true;
243244
} elseif ($token->type === Token::TYPE_KEYWORD
244245
&& $token->value === 'WHERE'
245246
) {
@@ -261,9 +262,6 @@ public function parse(Parser $parser, TokensList $list)
261262
} elseif ($token->type === Token::TYPE_KEYWORD) {
262263
$parser->error(__('Unexpected keyword.'), $token);
263264
break;
264-
} else {
265-
$parser->error(__('Unexpected token.'), $token);
266-
break;
267265
}
268266
} elseif ($state === 3) {
269267
if ($token->type === Token::TYPE_KEYWORD
@@ -272,18 +270,6 @@ public function parse(Parser $parser, TokensList $list)
272270
++$list->idx; // Skip 'WHERE'
273271
$this->where = Condition::parse($parser, $list);
274272
$state = 4;
275-
} elseif ($token->type === Token::TYPE_KEYWORD
276-
&& $token->value === 'ORDER BY'
277-
) {
278-
++$list->idx; // Skip 'ORDER BY'
279-
$this->order = OrderKeyword::parse($parser, $list);
280-
$state = 5;
281-
} elseif ($token->type === Token::TYPE_KEYWORD
282-
&& $token->value === 'LIMIT'
283-
) {
284-
++$list->idx; // Skip 'LIMIT'
285-
$this->limit = Limit::parse($parser, $list);
286-
$state = 6;
287273
} elseif ($token->type === Token::TYPE_KEYWORD) {
288274
$parser->error(__('Unexpected keyword.'), $token);
289275
break;
@@ -292,6 +278,16 @@ public function parse(Parser $parser, TokensList $list)
292278
break;
293279
}
294280
} elseif ($state === 4) {
281+
if ($multiTable === true
282+
&& $token->type === Token::TYPE_KEYWORD
283+
) {
284+
$parser->error(
285+
__('This type of clause is not valid in Multi-table queries.'),
286+
$token
287+
);
288+
break;
289+
}
290+
295291
if ($token->type === Token::TYPE_KEYWORD
296292
&& $token->value === 'ORDER BY'
297293
) {
@@ -307,9 +303,6 @@ public function parse(Parser $parser, TokensList $list)
307303
} elseif ($token->type === Token::TYPE_KEYWORD) {
308304
$parser->error(__('Unexpected keyword.'), $token);
309305
break;
310-
} else {
311-
$parser->error(__('Unexpected token.'), $token);
312-
break;
313306
}
314307
} elseif ($state === 5) {
315308
if ($token->type === Token::TYPE_KEYWORD
@@ -321,9 +314,6 @@ public function parse(Parser $parser, TokensList $list)
321314
} elseif ($token->type === Token::TYPE_KEYWORD) {
322315
$parser->error(__('Unexpected keyword.'), $token);
323316
break;
324-
} else {
325-
$parser->error(__('Unexpected token.'), $token);
326-
break;
327317
}
328318
}
329319
}

tests/Builder/DeleteStatementTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,13 @@ public function testBuilderMultiTable()
7878
$stmt = $parser->statements[0];
7979

8080
$this->assertEquals($query, $stmt->build());
81+
82+
/* Assertion 3 */
83+
$query = 'DELETE QUICK FROM table1, table2.* USING table1 AS `t1`, table2 AS `t2` WHERE 1=1';
84+
85+
$parser = new Parser($query);
86+
$stmt = $parser->statements[0];
87+
88+
$this->assertEquals($query, $stmt->build());
8189
}
8290
}

tests/Components/LimitTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
class LimitTest extends TestCase
1111
{
1212

13-
public function testBuild()
13+
public function testBuildWithoutOffset()
1414
{
1515
$component = new Limit(1);
1616
$this->assertEquals(Limit::build($component), '0, 1');

tests/Parser/DeleteStatementTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,19 @@ public function testDeleteProvider()
2828
array('parser/parseDelete8'),
2929
array('parser/parseDelete9'),
3030
array('parser/parseDelete10'),
31+
array('parser/parseDelete11'),
32+
array('parser/parseDelete12'),
33+
array('parser/parseDeleteErr1'),
34+
array('parser/parseDeleteErr2'),
35+
array('parser/parseDeleteErr3'),
36+
array('parser/parseDeleteErr4'),
37+
array('parser/parseDeleteErr5'),
38+
array('parser/parseDeleteErr6'),
39+
array('parser/parseDeleteErr7'),
40+
array('parser/parseDeleteErr8'),
41+
array('parser/parseDeleteErr9'),
42+
array('parser/parseDeleteErr10'),
43+
array('parser/parseDeleteErr11'),
3144
);
3245
}
3346
}

tests/data/parser/parseDelete.in

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
DELETE LOW_PRIORITY
2+
/* */
23
FROM
34
`test`.users
45
WHERE
56
`id`<3 AND (username="Dan" or username="Paul")
67
ORDER BY
7-
id;
8+
id
9+
;

0 commit comments

Comments
 (0)