summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Components/Array2d.php6
-rw-r--r--src/Components/OptionsArray.php6
-rw-r--r--src/Lexer.php26
-rw-r--r--src/Parser.php22
-rw-r--r--src/Statement.php5
-rw-r--r--src/Statements/CreateStatement.php2
-rw-r--r--tests/Lexer/LexerTest.php14
-rw-r--r--tests/Parser/ParserTest.php11
-rw-r--r--tests/data/parseCreateFunctionErr1.out2
-rw-r--r--tests/data/parseSelectErr1.out2
10 files changed, 73 insertions, 23 deletions
diff --git a/src/Components/Array2d.php b/src/Components/Array2d.php
index 64dea40..1660959 100644
--- a/src/Components/Array2d.php
+++ b/src/Components/Array2d.php
@@ -85,7 +85,11 @@ class Array2d extends Component
if ($count === -1) {
$count = $arrCount;
} elseif ($arrCount != $count) {
- $parser->error("{$count} values were expected, but found {$arrCount}.", $token);
+ $parser->error(
+ '%1$d values were expected, but found %2$d.',
+ $token,
+ array($count, $arrCount)
+ );
}
$ret[] = $arr;
$state = 1;
diff --git a/src/Components/OptionsArray.php b/src/Components/OptionsArray.php
index 487eefd..d1b9952 100644
--- a/src/Components/OptionsArray.php
+++ b/src/Components/OptionsArray.php
@@ -137,7 +137,11 @@ class OptionsArray extends Component
// real options (e.g. if there are 5 options, the first
// fake ID is 6).
if (isset($ret->options[$lastOptionId])) {
- $parser->error('This option conflicts with \'' . $ret->options[$lastOptionId] . '\'.', $token);
+ $parser->error(
+ 'This option conflicts with "%1$s".',
+ $token,
+ array($ret->options[$lastOptionId])
+ );
$lastOptionId = $lastAssignedId++;
}
} else {
diff --git a/src/Lexer.php b/src/Lexer.php
index aae95f1..d6c3784 100644
--- a/src/Lexer.php
+++ b/src/Lexer.php
@@ -13,6 +13,16 @@ namespace SqlParser;
use SqlParser\Exceptions\LexerException;
+if (!defined('USE_GETTEXT')) {
+
+ /**
+ * Whether `gettext` function should be used to translate error messages
+ * before throwing exceptions.
+ * @var bool
+ */
+ define('USE_GETTEXT', function_exists('gettext'));
+}
+
if (!defined('USE_UTF_STRINGS')) {
/**
@@ -302,14 +312,22 @@ class Lexer
* @param string $msg The error message.
* @param string $str The character that produced the error.
* @param int $pos The position of the character.
+ * @param array $args The arguments to be replaced in the message.
* @param int $code The code of the error.
*
* @throws LexerException Throws the exception, if strict mode is enabled.
*
* @return void
*/
- public function error($msg = '', $str = '', $pos = 0, $code = 0)
- {
+ public function error(
+ $msg = '', $str = '', $pos = 0, $args = null, $code = 0
+ ) {
+ if (USE_GETTEXT) {
+ $msg = gettext($msg);
+ }
+ if (!empty($args)) {
+ $msg = vsprintf($msg, $args);
+ }
$error = new LexerException($msg, $str, $pos, $code);
if ($this->strict) {
throw $error;
@@ -652,7 +670,9 @@ class Lexer
}
if (($this->last >= $this->len) || ($this->str[$this->last] !== $quote)) {
- $this->error('Ending quote ' . $quote . ' was expected.', '', $this->last);
+ $this->error(
+ 'Ending quote %1$s was expected.', '', $this->last, array($quote)
+ );
} else {
$token .= $this->str[$this->last];
}
diff --git a/src/Parser.php b/src/Parser.php
index 888a9d4..2fdd27c 100644
--- a/src/Parser.php
+++ b/src/Parser.php
@@ -12,6 +12,16 @@ namespace SqlParser;
use SqlParser\Statements\SelectStatement;
use SqlParser\Exceptions\ParserException;
+if (!defined('USE_GETTEXT')) {
+
+ /**
+ * Whether `gettext` function should be used to translate error messages
+ * before throwing exceptions.
+ * @var bool
+ */
+ define('USE_GETTEXT', function_exists('gettext'));
+}
+
/**
* Takes multiple tokens (contained in a Lexer instance) as input and builds a
* parse tree.
@@ -399,14 +409,22 @@ class Parser
*
* @param string $msg The error message.
* @param Token $token The token that produced the error.
+ * @param array $args The arguments to be replaced in the message.
* @param int $code The code of the error.
*
* @throws ParserException Throws the exception, if strict mode is enabled.
*
* @return void
*/
- public function error($msg = '', Token $token = null, $code = 0)
- {
+ public function error(
+ $msg = '', Token $token = null, $args = null, $code = 0
+ ) {
+ if (USE_GETTEXT) {
+ $msg = gettext($msg);
+ }
+ if (!empty($args)) {
+ $msg = vsprintf($msg, $args);
+ }
$error = new ParserException($msg, $token, $code);
if ($this->strict) {
throw $error;
diff --git a/src/Statement.php b/src/Statement.php
index 277942d..5e15d1e 100644
--- a/src/Statement.php
+++ b/src/Statement.php
@@ -248,10 +248,7 @@ abstract class Statement
} elseif ($class === null) {
// There is no parser for this keyword and isn't the beginning
// of a statement (so no options) either.
- $parser->error(
- 'Unrecognized keyword.',
- $token
- );
+ $parser->error('Unrecognized keyword.', $token);
continue;
}
diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php
index afabc6a..6bc1c98 100644
--- a/src/Statements/CreateStatement.php
+++ b/src/Statements/CreateStatement.php
@@ -326,7 +326,7 @@ class CreateStatement extends Statement
$token = $list->getNextOfType(Token::TYPE_KEYWORD);
if ($token->value !== 'RETURNS') {
$parser->error(
- 'A \'RETURNS\' keyword was expected.',
+ 'A "RETURNS" keyword was expected.',
$token
);
} else {
diff --git a/tests/Lexer/LexerTest.php b/tests/Lexer/LexerTest.php
index cd8718c..1a7c5f5 100644
--- a/tests/Lexer/LexerTest.php
+++ b/tests/Lexer/LexerTest.php
@@ -10,18 +10,22 @@ use SqlParser\Tests\TestCase;
class LexerTest extends TestCase
{
+ /**
+ * @runInSeparateProcess
+ * @preserveGlobalState disabled
+ */
public function testError()
{
$lexer = new Lexer('');
- $lexer->error('error #1', 'foo', 1, 2);
- $lexer->error('error #2', 'bar', 3, 4);
+ $lexer->error('error #1', 'foo', 1, array(), 2);
+ $lexer->error('%2$s #%1$d', 'bar', 3, array(2, 'error'), 4);
$this->assertEquals(
$lexer->errors,
array(
- new LexerException('error #1', 'foo', 1, 2),
- new LexerException('error #2', 'bar', 3, 4),
+ new LexerException('error #1', 'foo', 1, 2),
+ new LexerException('error #2', 'bar', 3, 4),
)
);
}
@@ -36,7 +40,7 @@ class LexerTest extends TestCase
$lexer = new Lexer('');
$lexer->strict = true;
- $lexer->error('strict error', 'foo', 1, 4);
+ $lexer->error('strict error', 'foo', 1, array(), 4);
}
/**
diff --git a/tests/Parser/ParserTest.php b/tests/Parser/ParserTest.php
index 66bbe04..82052a2 100644
--- a/tests/Parser/ParserTest.php
+++ b/tests/Parser/ParserTest.php
@@ -3,7 +3,6 @@
namespace SqlParser\Tests\Parser;
use SqlParser\Exceptions\ParserException;
-use SqlParser\Lexer;
use SqlParser\Parser;
use SqlParser\Token;
use SqlParser\TokensList;
@@ -36,12 +35,16 @@ class ParserTest extends TestCase
);
}
+ /**
+ * @runInSeparateProcess
+ * @preserveGlobalState disabled
+ */
public function testError()
{
$parser = new Parser(new TokensList());
- $parser->error('error #1', new Token('foo'), 1);
- $parser->error('error #2', new Token('bar'), 2);
+ $parser->error('error #1', new Token('foo'), array(), 1);
+ $parser->error('%2$s #%1$d', new Token('bar'), array(2, 'error'), 2);
$this->assertEquals(
$parser->errors,
@@ -62,6 +65,6 @@ class ParserTest extends TestCase
$parser = new Parser(new TokensList());
$parser->strict = true;
- $parser->error('strict error', new Token('foo'), 3);
+ $parser->error('strict error', new Token('foo'), array(), 3);
}
}
diff --git a/tests/data/parseCreateFunctionErr1.out b/tests/data/parseCreateFunctionErr1.out
index 9173c01..963d520 100644
--- a/tests/data/parseCreateFunctionErr1.out
+++ b/tests/data/parseCreateFunctionErr1.out
@@ -3,4 +3,4 @@ a:2:{s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";O:20:"SqlParser\TokensLi
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:37;}i:13;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"DECLARE";s:5:"value";s:7:"DECLARE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:42;}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:49;}i:15;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:50;}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:58;}i:17;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"VARCHAR";s:5:"value";s:7:"VARCHAR";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:59;}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:66;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:7:"DEFAULT";s:5:"value";s:7:"DEFAULT";s:4:"type";i:1;s:5:"flags";i:35;s:8:"position";i:67;}i:20;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:74;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"""";s:5:"value";s:0:"";s:4:"type";i:7;s:5:"flags";i:2;s:8:"position";i:75;}i:22;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:77;}i:23;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:78;}i:24;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:83;}i:25;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:89;}i:26;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:90;}i:27;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:98;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"INTO";s:5:"value";s:4:"INTO";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:99;}i:29;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:103;}i:30;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:104;}i:31;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:32;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:113;}i:33;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:117;}i:34;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"users";s:5:"value";s:5:"users";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:118;}i:35;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:123;}i:36;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:124;}i:37;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:38;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"ID";s:5:"value";s:2:"ID";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:130;}i:39;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:132;}i:40;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:133;}i:41;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:134;}i:42;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"uid";s:5:"value";s:3:"uid";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:135;}i:43;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:138;}i:44;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:139;}i:45;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"RETURN";s:5:"value";s:6:"RETURN";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:144;}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:150;}i:47;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:151;}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:159;}i:49;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:160;}i:50;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:161;}i:51;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:52;s:3:"idx";i:53;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\CreateStatement":10:{s:4:"name";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"F_TEST";s:6:"column";N;s:4:"expr";s:6:"F_TEST";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:13:"entityOptions";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:6:"fields";N;s:5:"table";N;s:6:"return";N;s:10:"parameters";a:1:{i:0;O:40:"SqlParser\Components\ParameterDefinition":3:{s:4:"name";s:3:"uid";s:5:"inOut";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:3:"INT";s:10:"parameters";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}}}s:4:"body";a:39:{i:0;r:83;i:1;r:89;i:2;r:95;i:3;r:101;i:4;r:107;i:5;r:113;i:6;r:119;i:7;r:125;i:8;r:131;i:9;r:137;i:10;r:143;i:11;r:149;i:12;r:155;i:13;r:161;i:14;r:167;i:15;r:173;i:16;r:179;i:17;r:185;i:18;r:191;i:19;r:197;i:20;r:203;i:21;r:209;i:22;r:215;i:23;r:221;i:24;r:227;i:25;r:233;i:26;r:239;i:27;r:245;i:28;r:251;i:29;r:257;i:30;r:263;i:31;r:269;i:32;r:275;i:33;r:281;i:34;r:287;i:35;r:293;i:36;r:299;i:37;r:305;i:38;r:311;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:6;s:8:"FUNCTION";}}s:5:"first";i:0;s:4:"last";i:52;}}}s:6:"errors";a:1:{i:0;a:3:{i:0;s:33:"A 'RETURNS' keyword was expected.";i:1;r:71;i:2;i:0;}}} \ No newline at end of file
+";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:160;}i:50;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:161;}i:51;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:52;s:3:"idx";i:53;}s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:1:{i:0;O:36:"SqlParser\Statements\CreateStatement":10:{s:4:"name";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:6:"F_TEST";s:6:"column";N;s:4:"expr";s:6:"F_TEST";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:13:"entityOptions";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:6:"fields";N;s:5:"table";N;s:6:"return";N;s:10:"parameters";a:1:{i:0;O:40:"SqlParser\Components\ParameterDefinition":3:{s:4:"name";s:3:"uid";s:5:"inOut";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:3:"INT";s:10:"parameters";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}}}s:4:"body";a:39:{i:0;r:83;i:1;r:89;i:2;r:95;i:3;r:101;i:4;r:107;i:5;r:113;i:6;r:119;i:7;r:125;i:8;r:131;i:9;r:137;i:10;r:143;i:11;r:149;i:12;r:155;i:13;r:161;i:14;r:167;i:15;r:173;i:16;r:179;i:17;r:185;i:18;r:191;i:19;r:197;i:20;r:203;i:21;r:209;i:22;r:215;i:23;r:221;i:24;r:227;i:25;r:233;i:26;r:239;i:27;r:245;i:28;r:251;i:29;r:257;i:30;r:263;i:31;r:269;i:32;r:275;i:33;r:281;i:34;r:287;i:35;r:293;i:36;r:299;i:37;r:305;i:38;r:311;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:6;s:8:"FUNCTION";}}s:5:"first";i:0;s:4:"last";i:52;}}}s:6:"errors";a:1:{i:0;a:3:{i:0;s:33:"A "RETURNS" keyword was expected.";i:1;r:71;i:2;i:0;}}} \ No newline at end of file
diff --git a/tests/data/parseSelectErr1.out b/tests/data/parseSelectErr1.out
index 6ec6ee5..b4685c9 100644
--- a/tests/data/parseSelectErr1.out
+++ b/tests/data/parseSelectErr1.out
@@ -11,4 +11,4 @@ a:2:{s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";O:20:"SqlParser\TokensLi
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:173;}i:60;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"ORDER BY";s:5:"value";s:8:"ORDER BY";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:174;}i:61;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:182;}i:62;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"username";s:5:"value";s:8:"username";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:187;}i:63;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:195;}i:64;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"DESC";s:5:"value";s:4:"DESC";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:196;}i:65;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:200;}i:66;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:201;}i:67;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"id";s:5:"value";s:2:"id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:206;}i:68;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:208;}i:69;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"LIMIT";s:5:"value";s:5:"LIMIT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:209;}i:70;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:214;}i:71;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:215;}i:72;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:216;}i:73;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:217;}i:74;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"3";s:5:"value";i:3;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:218;}i:75;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:219;}i:76;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:77;s:3:"idx";i:77;}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:4:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:5:"1 + 2";s:5:"alias";s:6:"result";s:8:"function";N;s:8:"subquery";N;}i:1;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:4:"@idx";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:2;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:3;O:31:"SqlParser\Components\Expression":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";s:8:"username";s:4:"expr";s:21:"test.`users`.username";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";s:4:"test";s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:12:"`test`.users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";O:29:"SqlParser\Components\ArrayObj":2:{s:3:"raw";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}s:6:"values";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}}s:5:"where";a:1:{i:0;O:30:"SqlParser\Components\Condition":3:{s:11:"identifiers";a:1:{i:0;s:2:"id";}s:10:"isOperator";b:0;s:4:"expr";s:6:"id > 0";}}s:5:"group";N;s:6:"having";N;s:5:"order";a:2:{i:0;O:33:"SqlParser\Components\OrderKeyword":2:{s:5:"field";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:8:"username";s:4:"expr";s:8:"username";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:4:"DESC";}i:1;O:33:"SqlParser\Components\OrderKeyword":2:{s:5:"field";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:3:"ASC";}}s:5:"limit";O:26:"SqlParser\Components\Limit":2:{s:6:"offset";i:2;s:8:"rowCount";i:3;}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:3:{i:1;s:3:"ALL";i:3;a:4:{s:4:"name";s:18:"MAX_STATEMENT_TIME";s:6:"equals";b:1;s:4:"expr";s:2:"10";s:5:"value";s:2:"10";}i:13;s:8:"DISTINCT";}}s:5:"first";i:0;s:4:"last";i:74;}}}s:6:"errors";a:2:{i:0;a:3:{i:0;s:33:"This option conflicts with 'ALL'.";i:1;r:29;i:2;i:0;}i:1;a:3:{i:0;s:22:"An alias was expected.";i:1;r:221;i:2;i:0;}}} \ No newline at end of file
+";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:208;}i:69;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"LIMIT";s:5:"value";s:5:"LIMIT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:209;}i:70;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:214;}i:71;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"2";s:5:"value";i:2;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:215;}i:72;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:216;}i:73;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:217;}i:74;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"3";s:5:"value";i:3;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:218;}i:75;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:219;}i:76;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:77;s:3:"idx";i:77;}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:4:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:5:"1 + 2";s:5:"alias";s:6:"result";s:8:"function";N;s:8:"subquery";N;}i:1;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:4:"@idx";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:2;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}i:3;O:31:"SqlParser\Components\Expression":7:{s:8:"database";s:4:"test";s:5:"table";s:5:"users";s:6:"column";s:8:"username";s:4:"expr";s:21:"test.`users`.username";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";s:4:"test";s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:12:"`test`.users";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";O:29:"SqlParser\Components\ArrayObj":2:{s:3:"raw";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}s:6:"values";a:2:{i:0;s:2:"p1";i:1;s:2:"p2";}}s:5:"where";a:1:{i:0;O:30:"SqlParser\Components\Condition":3:{s:11:"identifiers";a:1:{i:0;s:2:"id";}s:10:"isOperator";b:0;s:4:"expr";s:6:"id > 0";}}s:5:"group";N;s:6:"having";N;s:5:"order";a:2:{i:0;O:33:"SqlParser\Components\OrderKeyword":2:{s:5:"field";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:8:"username";s:4:"expr";s:8:"username";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:4:"DESC";}i:1;O:33:"SqlParser\Components\OrderKeyword":2:{s:5:"field";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";s:2:"id";s:4:"expr";s:2:"id";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:4:"type";s:3:"ASC";}}s:5:"limit";O:26:"SqlParser\Components\Limit":2:{s:6:"offset";i:2;s:8:"rowCount";i:3;}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:3:{i:1;s:3:"ALL";i:3;a:4:{s:4:"name";s:18:"MAX_STATEMENT_TIME";s:6:"equals";b:1;s:4:"expr";s:2:"10";s:5:"value";s:2:"10";}i:13;s:8:"DISTINCT";}}s:5:"first";i:0;s:4:"last";i:74;}}}s:6:"errors";a:2:{i:0;a:3:{i:0;s:33:"This option conflicts with "ALL".";i:1;r:29;i:2;i:0;}i:1;a:3:{i:0;s:22:"An alias was expected.";i:1;r:221;i:2;i:0;}}} \ No newline at end of file