Skip to content

Commit d3e3c6c

Browse files
committed
Support RLIKE, and improve whitespace handling
Signed-off-by: iifawzi <iifawzie@gmail.com>
1 parent 7bffada commit d3e3c6c

File tree

4 files changed

+63
-36
lines changed

4 files changed

+63
-36
lines changed

src/Components/Expression.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class Expression extends Component
4646
'OR' => 1,
4747
'OVER' => 1,
4848
'REGEXP' => 1,
49+
'RLIKE' => 1,
4950
'XOR' => 1,
5051
];
5152

@@ -385,7 +386,7 @@ public static function parse(Parser $parser, TokensList $list, array $options =
385386
$ret->expr !== null &&
386387
$beforeToken &&
387388
($beforeToken->type === Token::TYPE_NONE ||
388-
$beforeToken->type === Token::TYPE_SYMBOL) &&
389+
$beforeToken->type === Token::TYPE_SYMBOL || $beforeToken->type === Token::TYPE_STRING) &&
389390
$token->type === Token::TYPE_KEYWORD
390391
) {
391392
$ret->expr = rtrim($ret->expr, ' ') . ' ';

tests/Builder/SelectStatementTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ public function testBuilder(): void
3737
$stmt = $parser->statements[0];
3838

3939
$this->assertEquals('SELECT 1 BETWEEN 0 AND 2', $stmt->build());
40+
41+
$parser = new Parser("SELECT 'a' NOT REGEXP '^[a-d]'");
42+
$stmt = $parser->statements[0];
43+
44+
$this->assertEquals("SELECT 'a' NOT REGEXP '^[a-d]'", $stmt->build());
45+
46+
$parser = new Parser("SELECT 'a' RLIKE 'a'");
47+
$stmt = $parser->statements[0];
48+
49+
$this->assertEquals("SELECT 'a' RLIKE 'a'", $stmt->build());
4050
}
4151

4252
public function testBuilderUnion(): void

tests/data/bugs/pma11800.out

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -567,23 +567,27 @@
567567
{
568568
"@type": "PhpMyAdmin\\SqlParser\\Components\\Expression",
569569
"ALLOWED_KEYWORDS": {
570+
"AND": 1,
570571
"AS": 1,
571-
"DUAL": 1,
572-
"NULL": 1,
573-
"REGEXP": 1,
572+
"BETWEEN": 1,
574573
"CASE": 1,
574+
"DUAL": 1,
575575
"DIV": 1,
576-
"AND": 1,
577-
"OR": 1,
578-
"XOR": 1,
579-
"NOT": 1,
576+
"IS": 1,
580577
"MOD": 1,
581-
"OVER": 2
578+
"NOT": 1,
579+
"NOT NULL": 1,
580+
"NULL": 1,
581+
"OR": 1,
582+
"OVER": 1,
583+
"REGEXP": 1,
584+
"RLIKE": 1,
585+
"XOR": 1
582586
},
583587
"database": null,
584588
"table": null,
585589
"column": "a",
586-
"expr": "'a'REGEXP '^[a-d]'",
590+
"expr": "'a' REGEXP '^[a-d]'",
587591
"alias": null,
588592
"function": null,
589593
"subquery": null

tests/data/parser/parseAlterUser.out

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -491,18 +491,22 @@
491491
"table": {
492492
"@type": "PhpMyAdmin\\SqlParser\\Components\\Expression",
493493
"ALLOWED_KEYWORDS": {
494+
"AND": 1,
494495
"AS": 1,
495-
"DUAL": 1,
496-
"NULL": 1,
497-
"REGEXP": 1,
496+
"BETWEEN": 1,
498497
"CASE": 1,
498+
"DUAL": 1,
499499
"DIV": 1,
500-
"AND": 1,
501-
"OR": 1,
502-
"XOR": 1,
503-
"NOT": 1,
500+
"IS": 1,
504501
"MOD": 1,
505-
"OVER": 2
502+
"NOT": 1,
503+
"NOT NULL": 1,
504+
"NULL": 1,
505+
"OR": 1,
506+
"OVER": 1,
507+
"REGEXP": 1,
508+
"RLIKE": 1,
509+
"XOR": 1
506510
},
507511
"database": null,
508512
"table": "jeffrey@localhost",
@@ -654,47 +658,55 @@
654658
"expr": {
655659
"@type": "PhpMyAdmin\\SqlParser\\Components\\Expression",
656660
"ALLOWED_KEYWORDS": {
661+
"AND": 1,
657662
"AS": 1,
658-
"DUAL": 1,
659-
"NULL": 1,
660-
"REGEXP": 1,
663+
"BETWEEN": 1,
661664
"CASE": 1,
665+
"DUAL": 1,
662666
"DIV": 1,
663-
"AND": 1,
664-
"OR": 1,
665-
"XOR": 1,
666-
"NOT": 1,
667+
"IS": 1,
667668
"MOD": 1,
668-
"OVER": 2
669+
"NOT": 1,
670+
"NOT NULL": 1,
671+
"NULL": 1,
672+
"OR": 1,
673+
"OVER": 1,
674+
"REGEXP": 1,
675+
"RLIKE": 1,
676+
"XOR": 1
669677
},
670678
"database": null,
671679
"table": null,
672680
"column": "new_password",
673-
"expr": "'new_password'PASSWORD",
681+
"expr": "'new_password' PASSWORD",
674682
"alias": null,
675683
"function": null,
676684
"subquery": null
677685
},
678-
"value": "'new_password'PASSWORD"
686+
"value": "'new_password' PASSWORD"
679687
},
680688
"3": "IDENTIFIED"
681689
}
682690
},
683691
"field": {
684692
"@type": "PhpMyAdmin\\SqlParser\\Components\\Expression",
685693
"ALLOWED_KEYWORDS": {
694+
"AND": 1,
686695
"AS": 1,
687-
"DUAL": 1,
688-
"NULL": 1,
689-
"REGEXP": 1,
696+
"BETWEEN": 1,
690697
"CASE": 1,
698+
"DUAL": 1,
691699
"DIV": 1,
692-
"AND": 1,
693-
"OR": 1,
694-
"XOR": 1,
695-
"NOT": 1,
700+
"IS": 1,
696701
"MOD": 1,
697-
"OVER": 2
702+
"NOT": 1,
703+
"NOT NULL": 1,
704+
"NULL": 1,
705+
"OR": 1,
706+
"OVER": 1,
707+
"REGEXP": 1,
708+
"RLIKE": 1,
709+
"XOR": 1
698710
},
699711
"database": null,
700712
"table": null,

0 commit comments

Comments
 (0)