Skip to content

Commit c496216

Browse files
committed
Added tests for BufferedQuery and Parser.
1 parent 95d7fa7 commit c496216

4 files changed

Lines changed: 288 additions & 2 deletions

File tree

tests/Parser/ParserTest.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,20 @@
1212
class ParserTest extends TestCase
1313
{
1414

15-
public function testParse()
15+
/**
16+
* @dataProvider testParseProvider
17+
*/
18+
public function testParse($test)
19+
{
20+
$this->runParserTest($test);
21+
}
22+
23+
public function testParseProvider()
1624
{
17-
$this->runParserTest('parser/parse');
25+
return array(
26+
array('parser/parse'),
27+
array('parser/parseDelimiter'),
28+
);
1829
}
1930

2031
public function testUnrecognizedStatement()

tests/Utils/BufferedQueryTest.php

Lines changed: 257 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,257 @@
1+
<?php
2+
3+
namespace SqlParser\Tests\Utils;
4+
5+
use SqlParser\Utils\BufferedQuery;
6+
7+
use SqlParser\Tests\TestCase;
8+
9+
class BufferedQueryTest extends TestCase
10+
{
11+
12+
/**
13+
* @dataProvider testExtractProvider
14+
*/
15+
public function testExtract(
16+
$query, $chunkSize, array $options = array(), array $expected
17+
) {
18+
$chunks = str_split($query, $chunkSize);
19+
$count = count($chunks);
20+
21+
/**
22+
* The array of extracted statements.
23+
* @var array $statements
24+
*/
25+
$statements = array();
26+
27+
/**
28+
* The `BufferedQuery` instance used for extraction.
29+
* @var BufferedQuery $bq
30+
*/
31+
$bq = new BufferedQuery('', $options);
32+
33+
// Feeding chunks and extracting queries.
34+
$i = 0;
35+
while ($i < $count) {
36+
if (($stmt = $bq->extract())) {
37+
$statements[] = $stmt;
38+
} else {
39+
$bq->query .= $chunks[$i++];
40+
}
41+
}
42+
43+
// Feeding ended, extracting remaining queries.
44+
while (($stmt = $bq->extract(true))) {
45+
$statements[] = $stmt;
46+
}
47+
48+
$this->assertEquals($expected, $statements);
49+
}
50+
51+
public function testExtractProvider()
52+
{
53+
$query =
54+
'/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;' . "\n" .
55+
'/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;' . "\n" .
56+
'/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;' . "\n" .
57+
'/*!40101 SET NAMES utf8mb4 */;' . "\n" .
58+
'' . "\n" .
59+
'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\';' . "\n" .
60+
'SET time_zone = "+00:00";' . "\n" .
61+
'' . "\n" .
62+
'/* a comment */ DELIMITER $$' . "\n" .
63+
'' . "\n" .
64+
'# Bash-like comment sytanx.' . "\n" .
65+
'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT) READS SQL DATA' . "\n" .
66+
'BEGIN' . "\n" .
67+
' SELECT inventory_id' . "\n" .
68+
' FROM inventory' . "\n" .
69+
' WHERE film_id = p_film_id' . "\n" .
70+
' AND store_id = p_store_id' . "\n" .
71+
' AND inventory_in_stock(inventory_id);' . "\n" .
72+
'' . "\n" .
73+
' SELECT FOUND_ROWS() INTO p_film_count;' . "\n" .
74+
'END$$' . "\n" .
75+
'' . "\n" .
76+
'DELIMITER ;' . "\n" .
77+
'' . "\n" .
78+
'-- --------------------------------------------------------' . "\n" .
79+
'' . "\n" .
80+
'--' . "\n" .
81+
'-- Table structure for `actor`' . "\n" .
82+
'--' . "\n" .
83+
'' . "\n" .
84+
'/* C-like comment syntax. */' . "\n" .
85+
'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" .
86+
'`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" .
87+
'`first_name` VARCHAR(45) NOT NULL,' . "\n" .
88+
'`last_name` VARCHAR(45) NOT NULL,' . "\n" .
89+
'`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" .
90+
') ENGINE=InnoDB DEFAULT CHARSET=utf8;' . "\n" .
91+
'' . "\n" .
92+
'/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;' . "\n" .
93+
'/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;' . "\n" .
94+
'/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */';
95+
96+
return array(
97+
98+
array(
99+
'DELIMITER A_VERY_LONG_DEL' . "\n" .
100+
'SELECT 1 A_VERY_LONG_DEL' . "\n" .
101+
'DELIMITER ;',
102+
3,
103+
array(
104+
'parse_delimiter' => true,
105+
'add_delimiter' => true,
106+
),
107+
array(
108+
'DELIMITER A_VERY_LONG_DEL',
109+
'SELECT 1 A_VERY_LONG_DEL',
110+
'DELIMITER ;'
111+
)
112+
),
113+
114+
array(
115+
$query,
116+
32,
117+
array(
118+
'parse_delimiter' => false,
119+
'add_delimiter' => false,
120+
),
121+
array(
122+
'/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */',
123+
124+
'/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */',
125+
126+
'/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */',
127+
128+
'/*!40101 SET NAMES utf8mb4 */',
129+
130+
'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\'',
131+
132+
'SET time_zone = "+00:00"',
133+
134+
'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT) READS SQL DATA' . "\n" .
135+
'BEGIN' . "\n" .
136+
' SELECT inventory_id' . "\n" .
137+
' FROM inventory' . "\n" .
138+
' WHERE film_id = p_film_id' . "\n" .
139+
' AND store_id = p_store_id' . "\n" .
140+
' AND inventory_in_stock(inventory_id);' . "\n" .
141+
'' . "\n" .
142+
' SELECT FOUND_ROWS() INTO p_film_count;' . "\n" .
143+
'END',
144+
145+
'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" .
146+
'`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" .
147+
'`first_name` VARCHAR(45) NOT NULL,' . "\n" .
148+
'`last_name` VARCHAR(45) NOT NULL,' . "\n" .
149+
'`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" .
150+
') ENGINE=InnoDB DEFAULT CHARSET=utf8',
151+
152+
'/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */',
153+
154+
'/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */',
155+
156+
'/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */'
157+
)
158+
),
159+
160+
array(
161+
$query,
162+
32,
163+
array(
164+
'parse_delimiter' => true,
165+
'add_delimiter' => false,
166+
),
167+
array(
168+
'/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */',
169+
170+
'/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */',
171+
172+
'/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */',
173+
174+
'/*!40101 SET NAMES utf8mb4 */',
175+
176+
'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\'',
177+
178+
'SET time_zone = "+00:00"',
179+
180+
'DELIMITER $$',
181+
182+
'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT) READS SQL DATA' . "\n" .
183+
'BEGIN' . "\n" .
184+
' SELECT inventory_id' . "\n" .
185+
' FROM inventory' . "\n" .
186+
' WHERE film_id = p_film_id' . "\n" .
187+
' AND store_id = p_store_id' . "\n" .
188+
' AND inventory_in_stock(inventory_id);' . "\n" .
189+
'' . "\n" .
190+
' SELECT FOUND_ROWS() INTO p_film_count;' . "\n" .
191+
'END',
192+
193+
'DELIMITER ;',
194+
195+
'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" .
196+
'`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" .
197+
'`first_name` VARCHAR(45) NOT NULL,' . "\n" .
198+
'`last_name` VARCHAR(45) NOT NULL,' . "\n" .
199+
'`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" .
200+
') ENGINE=InnoDB DEFAULT CHARSET=utf8',
201+
202+
'/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */',
203+
204+
'/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */',
205+
206+
'/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */',
207+
)
208+
),
209+
210+
array(
211+
$query,
212+
64,
213+
array(
214+
'parse_delimiter' => false,
215+
'add_delimiter' => true,
216+
),
217+
array(
218+
'/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;',
219+
220+
'/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;',
221+
222+
'/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;',
223+
224+
'/*!40101 SET NAMES utf8mb4 */;',
225+
226+
'SET SQL_MODE = \'NO_AUTO_VALUE_ON_ZERO\';',
227+
228+
'SET time_zone = "+00:00";',
229+
230+
'CREATE DEFINER=`root`@`localhost` PROCEDURE `film_in_stock` (IN `p_film_id` INT, IN `p_store_id` INT, OUT `p_film_count` INT) READS SQL DATA' . "\n" .
231+
'BEGIN' . "\n" .
232+
' SELECT inventory_id' . "\n" .
233+
' FROM inventory' . "\n" .
234+
' WHERE film_id = p_film_id' . "\n" .
235+
' AND store_id = p_store_id' . "\n" .
236+
' AND inventory_in_stock(inventory_id);' . "\n" .
237+
'' . "\n" .
238+
' SELECT FOUND_ROWS() INTO p_film_count;' . "\n" .
239+
'END$$',
240+
241+
'CREATE TABLE IF NOT EXISTS `actor` (' . "\n" .
242+
'`actor_id` SMALLINT(5) UNSIGNED NOT NULL,' . "\n" .
243+
'`first_name` VARCHAR(45) NOT NULL,' . "\n" .
244+
'`last_name` VARCHAR(45) NOT NULL,' . "\n" .
245+
'`last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' . "\n" .
246+
') ENGINE=InnoDB DEFAULT CHARSET=utf8;',
247+
248+
'/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;',
249+
250+
'/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;',
251+
252+
'/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */'
253+
)
254+
)
255+
);
256+
}
257+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
SELECT * FROM foo;
2+
DELIMITER $$
3+
SELECT * FROM bar$$
4+
DELIMITER ;
5+
SELECT * FROM baz;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
a:4:{s:5:"query";s:82:"SELECT * FROM foo;
2+
DELIMITER $$
3+
SELECT * FROM bar$$
4+
DELIMITER ;
5+
SELECT * FROM baz;";s:5:"lexer";O:15:"SqlParser\Lexer":8:{s:6:"strict";b:0;s:3:"str";s:82:"SELECT * FROM foo;
6+
DELIMITER $$
7+
SELECT * FROM bar$$
8+
DELIMITER ;
9+
SELECT * FROM baz;";s:3:"len";i:82;s:4:"last";i:82;s:4:"list";O:20:"SqlParser\TokensList":3:{s:6:"tokens";a:35:{i:0;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: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:6;}i:2;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:7;}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:4:"FROM";s:5:"value";s:4:"FROM";s:4:"type";i:1;s:5:"flags";i:3;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:13;}i:6;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"foo";s:5:"value";s:3:"foo";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:14;}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:17;}i:8;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"
10+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:18;}i:9;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"DELIMITER";s:5:"value";s:9:"DELIMITER";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:19;}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:28;}i:11;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"$$";s:5:"value";s:2:"$$";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:29;}i:12;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"
11+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:31;}i:13;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:32;}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:38;}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:1;s:8:"position";i:39;}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:40;}i:17;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:41;}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:45;}i:19;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"bar";s:5:"value";s:3:"bar";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:46;}i:20;O:15:"SqlParser\Token":5:{s:5:"token";s:2:"$$";s:5:"value";s:2:"$$";s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:49;}i:21;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"
12+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:51;}i:22;O:15:"SqlParser\Token":5:{s:5:"token";s:9:"DELIMITER";s:5:"value";s:9:"DELIMITER";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:52;}i:23;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:61;}i:24;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:62;}i:25;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"
13+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:63;}i:26;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:64;}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:70;}i:28;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"*";s:5:"value";s:1:"*";s:4:"type";i:2;s:5:"flags";i:1;s:8:"position";i:71;}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:72;}i:30;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:73;}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:77;}i:32;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"baz";s:5:"value";s:3:"baz";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:78;}i:33;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:81;}i:34;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:35;s:3:"idx";i:35;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"errors";a:0:{}}s:6:"parser";O:16:"SqlParser\Parser":4:{s:4:"list";r:8;s:6:"strict";b:0;s:6:"errors";a:0:{}s:10:"statements";a:3:{i:0;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:1:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";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";N;s:5:"table";s:3:"foo";s:6:"column";N;s:4:"expr";s:3:"foo";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;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:0:{}}s:5:"first";i:0;s:4:"last";i:6;}i:1;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:1:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";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";N;s:5:"table";s:3:"bar";s:6:"column";N;s:4:"expr";s:3:"bar";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;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:0:{}}s:5:"first";i:13;s:4:"last";i:19;}i:2;O:36:"SqlParser\Statements\SelectStatement":15:{s:4:"expr";a:1:{i:0;O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:1:"*";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";N;s:5:"table";s:3:"baz";s:6:"column";N;s:4:"expr";s:3:"baz";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}}s:9:"partition";N;s:5:"where";N;s:5:"group";N;s:6:"having";N;s:5:"order";N;s:5:"limit";N;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:0:{}}s:5:"first";i:26;s:4:"last";i:32;}}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}

0 commit comments

Comments
 (0)