GeezerVison is showing github.com — Recognize question mark as parameter, add formatter for parameters · phpmyadmin/sql-parser@3adf389
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: src/Context.php +1-1Lines changed: 1 addition & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -389,7 +389,7 @@ public static function isSymbol($str) | 389 | 389 | return Token::FLAG_SYMBOL_VARIABLE; | 390 | 390 | } elseif ($str[0] === '`') { | 391 | 391 | return Token::FLAG_SYMBOL_BACKTICK; | 392 | | - } elseif ($str[0] === ':') { | | 392 | + } elseif ($str[0] === ':' || $str[0] === '?') { | 393 | 393 | return Token::FLAG_SYMBOL_PARAMETER; | 394 | 394 | } | 395 | 395 |
| |
Collapse file Copy file name to clipboardExpand all lines: src/Lexer.php +1-1Lines changed: 1 addition & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -872,7 +872,7 @@ public function parseSymbol() | 872 | 872 | $flags |= Token::FLAG_SYMBOL_SYSTEM; | 873 | 873 | } | 874 | 874 | } elseif ($flags & Token::FLAG_SYMBOL_PARAMETER) { | 875 | | - if ($this->last + 1 < $this->len) { | | 875 | + if ('?' !== $token && $this->last + 1 < $this->len) { | 876 | 876 | ++$this->last; | 877 | 877 | } | 878 | 878 | } else { | |
Collapse file Copy file name to clipboardExpand all lines: src/Utils/Formatter.php +7Lines changed: 7 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -225,6 +225,13 @@ protected function getDefaultFormats() | 225 | 225 | 'cli' => "\x1b[91m", | 226 | 226 | 'function' => '', | 227 | 227 | ), | | 228 | + array( | | 229 | + 'type' => Token::TYPE_SYMBOL, | | 230 | + 'flags' => Token::FLAG_SYMBOL_PARAMETER, | | 231 | + 'html' => 'class="sql-parameter"', | | 232 | + 'cli' => "\x1b[31m", | | 233 | + 'function' => '', | | 234 | + ), | 228 | 235 | array( | 229 | 236 | 'type' => Token::TYPE_SYMBOL, | 230 | 237 | 'flags' => 0, | |
Collapse file Copy file name to clipboardExpand all lines: tests/Lexer/TokenTest.php +6Lines changed: 6 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -74,6 +74,12 @@ public function testExtractSymbol() | 74 | 74 |
| 75 | 75 | $tok = new Token('@`foo`', Token::TYPE_SYMBOL, Token::FLAG_SYMBOL_VARIABLE); | 76 | 76 | $this->assertEquals($tok->value, 'foo'); | | 77 | + | | 78 | + $tok = new Token(':foo', Token::TYPE_SYMBOL, Token::FLAG_SYMBOL_PARAMETER); | | 79 | + $this->assertEquals($tok->value, 'foo'); | | 80 | + | | 81 | + $tok = new Token('?', Token::TYPE_SYMBOL, Token::FLAG_SYMBOL_PARAMETER); | | 82 | + $this->assertEquals($tok->value, '?'); | 77 | 83 | } | 78 | 84 |
| 79 | 85 | public function testInlineToken() | |
Collapse file Copy file name to clipboardExpand all lines: tests/Utils/FormatterTest.php +42Lines changed: 42 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -506,6 +506,48 @@ public function formatQueries() | 506 | 506 | "\x1b[0m", | 507 | 507 | 'html' => '<span class="sql-reserved">JOIN</span> tbl2 <span class="sql-reserved">ON</span> c1 = c2', | 508 | 508 | ), | | 509 | + 'named param' => array( | | 510 | + 'query' => 'select * from tbl where col = :param', | | 511 | + 'text' => 'SELECT' . "\n" . | | 512 | + ' *' . "\n" . | | 513 | + 'FROM' . "\n" . | | 514 | + ' tbl' . "\n" . | | 515 | + 'WHERE' . "\n" . | | 516 | + ' col = :param', | | 517 | + 'cli' => "\x1b[35mSELECT" . "\n" . | | 518 | + " \x1b[39m*" . "\n" . | | 519 | + "\x1b[35mFROM" . "\n" . | | 520 | + " \x1b[39mtbl" . "\n" . | | 521 | + "\x1b[35mWHERE" . "\n" . | | 522 | + " \x1b[39mcol = \x1b[31m:param" . "\x1b[0m", | | 523 | + 'html' => '<span class="sql-reserved">SELECT</span>' . '<br/>' . | | 524 | + ' *' . '<br/>' . | | 525 | + '<span class="sql-reserved">FROM</span>' . '<br/>' . | | 526 | + ' tbl' . '<br/>' . | | 527 | + '<span class="sql-reserved">WHERE</span>' . '<br/>' . | | 528 | + ' col = <span class="sql-parameter">:param</span>', | | 529 | + ), | | 530 | + 'anon param' => array( | | 531 | + 'query' => 'select * from tbl where col = ?', | | 532 | + 'text' => 'SELECT' . "\n" . | | 533 | + ' *' . "\n" . | | 534 | + 'FROM' . "\n" . | | 535 | + ' tbl' . "\n" . | | 536 | + 'WHERE' . "\n" . | | 537 | + ' col = ?', | | 538 | + 'cli' => "\x1b[35mSELECT" . "\n" . | | 539 | + " \x1b[39m*" . "\n" . | | 540 | + "\x1b[35mFROM" . "\n" . | | 541 | + " \x1b[39mtbl" . "\n" . | | 542 | + "\x1b[35mWHERE" . "\n" . | | 543 | + " \x1b[39mcol = \x1b[31m?" . "\x1b[0m", | | 544 | + 'html' => '<span class="sql-reserved">SELECT</span>' . '<br/>' . | | 545 | + ' *' . '<br/>' . | | 546 | + '<span class="sql-reserved">FROM</span>' . '<br/>' . | | 547 | + ' tbl' . '<br/>' . | | 548 | + '<span class="sql-reserved">WHERE</span>' . '<br/>' . | | 549 | + ' col = <span class="sql-parameter">?</span>', | | 550 | + ), | 509 | 551 | ); | 510 | 552 | } | 511 | 553 | } |
|