Skip to content

Commit a36dbf2

Browse files
committed
Lex system variables as symbols. Fixed #13.
1 parent 3f4c3df commit a36dbf2

5 files changed

Lines changed: 20 additions & 8 deletions

File tree

src/Lexer.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -799,7 +799,11 @@ public function parseSymbol()
799799
}
800800

801801
if ($flags & Token::FLAG_SYMBOL_VARIABLE) {
802-
++$this->last;
802+
if ($this->str[++$this->last] === '@') {
803+
// This is a system variable (e.g. `@@hostname`).
804+
$token .= $this->str[$this->last++];
805+
$flags |= Token::FLAG_SYMBOL_SYSTEM;
806+
}
803807
} else {
804808
$token = '';
805809
}

src/Token.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ class Token
157157
const FLAG_SYMBOL_VARIABLE = 1;
158158
const FLAG_SYMBOL_BACKTICK = 2;
159159
const FLAG_SYMBOL_USER = 4;
160+
const FLAG_SYMBOL_SYSTEM = 8;
160161

161162
/**
162163
* The token it its raw string representation.
@@ -256,7 +257,12 @@ public function extract()
256257
if ((isset($str[0])) && ($str[0] === '@')) {
257258
// `mb_strlen($str)` must be used instead of `null` because
258259
// in PHP 5.3- the `null` parameter isn't handled correctly.
259-
$str = mb_substr($str, 1, mb_strlen($str), 'UTF-8');
260+
$str = mb_substr(
261+
$str,
262+
((!empty($str[1])) && ($str[1] === '@')) ? 2 : 1,
263+
mb_strlen($str),
264+
'UTF-8'
265+
);
260266
}
261267
if ((isset($str[0])) && (($str[0] === '`')
262268
|| ($str[0] === '"') || ($str[0] === '\''))

tests/bootstrap.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ public function getErrorsAsArray($obj)
6666
*/
6767
public function getData($name)
6868
{
69-
return unserialize(file_get_contents('tests/data/' . $name . '.out'));
69+
$data = unserialize(file_get_contents('tests/data/' . $name . '.out'));
70+
$data['query'] = file_get_contents('tests/data/' . $name . '.in');
71+
return $data;
7072
}
7173

7274
/**

tests/data/lexer/lexSymbol.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
SET @idx := 1;
2-
SELECT @idx, @`idx`, @'idx'
2+
SELECT @idx, @`idx`, @'idx', @@hostname

tests/data/lexer/lexSymbol.out

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
a:4:{s:5:"query";s:42:"SET @idx := 1;
2-
SELECT @idx, @`idx`, @'idx'";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:42:"SET @idx := 1;
3-
SELECT @idx, @`idx`, @'idx'";s:3:"len";i:42;s:4:"last";i:42;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:19:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;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:3;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"@idx";s:5:"value";s:3:"idx";s:4:"type";i:8;s:5:"flags";i:1;s:8:"position";i:4;}i:3;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:8;}i:4;O:15:"SqlParser\Token":5:{s:5:"token";s:2:":=";s:5:"value";s:2:":=";s:4:"type";i:2;s:5:"flags";i:8;s:8:"position";i:9;}i:5;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:11;}i:6;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:12;}i:7;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:13;}i:8;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:14;}i:9;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:15;}i:10;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:21;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"@idx";s:5:"value";s:3:"idx";s:4:"type";i:8;s:5:"flags";i:1;s:8:"position";i:22;}i:12;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:26;}i:13;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:27;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"@`idx`";s:5:"value";s:3:"idx";s:4:"type";i:8;s:5:"flags";i:1;s:8:"position";i:28;}i:15;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:34;}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:35;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"@'idx'";s:5:"value";s:3:"idx";s:4:"type";i:8;s:5:"flags";i:1;s:8:"position";i:36;}i:18;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:19;s:3:"idx";i:0;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";N;s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}
1+
a:4:{s:5:"query";s:54:"SET @idx := 1;
2+
SELECT @idx, @`idx`, @'idx', @@hostname";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:54:"SET @idx := 1;
3+
SELECT @idx, @`idx`, @'idx', @@hostname";s:3:"len";i:54;s:4:"last";i:54;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:22:{i:0;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"SET";s:5:"value";s:3:"SET";s:4:"type";i:1;s:5:"flags";i:11;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:3;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"@idx";s:5:"value";s:3:"idx";s:4:"type";i:8;s:5:"flags";i:1;s:8:"position";i:4;}i:3;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:8;}i:4;O:15:"SqlParser\Token":5:{s:5:"token";s:2:":=";s:5:"value";s:2:":=";s:4:"type";i:2;s:5:"flags";i:8;s:8:"position";i:9;}i:5;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:11;}i:6;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:12;}i:7;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:13;}i:8;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:14;}i:9;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:15;}i:10;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:21;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"@idx";s:5:"value";s:3:"idx";s:4:"type";i:8;s:5:"flags";i:1;s:8:"position";i:22;}i:12;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:26;}i:13;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:27;}i:14;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"@`idx`";s:5:"value";s:3:"idx";s:4:"type";i:8;s:5:"flags";i:1;s:8:"position";i:28;}i:15;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:34;}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:35;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"@'idx'";s:5:"value";s:3:"idx";s:4:"type";i:8;s:5:"flags";i:1;s:8:"position";i:36;}i:18;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:42;}i:19;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:43;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"@@hostname";s:5:"value";s:8:"hostname";s:4:"type";i:8;s:5:"flags";i:9;s:8:"position";i:44;}i:21;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:22;s:3:"idx";i:0;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";N;s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}

0 commit comments

Comments
 (0)