Skip to content

Commit 1415469

Browse files
committed
Better parsing for CREATE TABLE statements.
Fixes #16.
1 parent 9098d37 commit 1415469

File tree

8 files changed

+105
-7
lines changed

8 files changed

+105
-7
lines changed

src/Components/Key.php

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ public static function parse(Parser $parser, TokensList $list, array $options =
9595
{
9696
$ret = new Key();
9797

98+
/**
99+
* Last parsed column.
100+
*
101+
* @var array
102+
*/
103+
$lastColumn = array();
104+
98105
/**
99106
* The state of the parser.
100107
*
@@ -135,12 +142,31 @@ public static function parse(Parser $parser, TokensList $list, array $options =
135142
$state = 1;
136143
} elseif ($state === 1) {
137144
if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '(')) {
138-
$ret->columns = ArrayObj::parse($parser, $list)->values;
139145
$state = 2;
140146
} else {
141147
$ret->name = $token->value;
142148
}
143149
} elseif ($state === 2) {
150+
if ($token->type === Token::TYPE_OPERATOR) {
151+
if ($token->value === '(') {
152+
$state = 3;
153+
} elseif (($token->value === ',') || ($token->value === ')')) {
154+
$state = ($token->value === ',') ? 2 : 4;
155+
if (!empty($lastColumn)) {
156+
$ret->columns[] = $lastColumn;
157+
$lastColumn = array();
158+
}
159+
}
160+
} else {
161+
$lastColumn['name'] = $token->value;
162+
}
163+
} elseif ($state === 3) {
164+
if (($token->type === Token::TYPE_OPERATOR) && ($token->value === ')')) {
165+
$state = 2;
166+
} else {
167+
$lastColumn['length'] = $token->value;
168+
}
169+
} elseif ($state === 4) {
144170
$ret->options = OptionsArray::parse($parser, $list, static::$KEY_OPTIONS);
145171
++$list->idx;
146172
break;
@@ -163,8 +189,17 @@ public static function build($component, array $options = array())
163189
if (!empty($component->name)) {
164190
$ret .= Context::escape($component->name) . ' ';
165191
}
166-
$ret .= '(' . implode(',', Context::escape($component->columns)) . ') '
167-
. $component->options;
192+
193+
$columns = array();
194+
foreach ($component->columns as $column) {
195+
$tmp = Context::escape($column['name']);
196+
if (isset($column['length'])) {
197+
$tmp .= '(' . $column['length'] . ')';
198+
}
199+
$columns[] = $tmp;
200+
}
201+
202+
$ret .= '(' . implode(',', $columns) . ') ' . $component->options;
168203
return trim($ret);
169204
}
170205
}

src/Utils/Table.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,14 @@ public static function getForeignKeys($statement)
4545
continue;
4646
}
4747

48+
$columns = array();
49+
foreach ($field->key->columns as $column) {
50+
$columns[] = $column['name'];
51+
}
52+
4853
$tmp = array(
4954
'constraint' => $field->name,
50-
'index_list' => $field->key->columns,
55+
'index_list' => $columns,
5156
);
5257

5358
if (!empty($field->references)) {

tests/Builder/CreateStatementTest.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function testBuilderTable()
5252
new CreateDefinition(
5353
'',
5454
null,
55-
new Key('', array('id'), 'PRIMARY KEY')
55+
new Key('', array(array('name' => 'id')), 'PRIMARY KEY')
5656
)
5757
);
5858

@@ -63,6 +63,21 @@ public function testBuilderTable()
6363
") ",
6464
$stmt->build()
6565
);
66+
67+
$query =
68+
"CREATE TABLE `jos_core_acl_aro` (\n" .
69+
" `id` int(11) NOT NULL,\n" .
70+
" `section_value` varchar(240) NOT NULL DEFAULT '0',\n" .
71+
" `value` varchar(240) NOT NULL DEFAULT '',\n" .
72+
" `order_value` int(11) NOT NULL DEFAULT '0',\n" .
73+
" `name` varchar(255) NOT NULL DEFAULT '',\n" .
74+
" `hidden` int(11) NOT NULL DEFAULT '0',\n" .
75+
" PRIMARY KEY (`id`),\n" .
76+
" UNIQUE KEY `jos_section_value_value_aro` (`section_value`(100),`value`(15)) USING BTREE,\n" .
77+
" KEY `jos_gacl_hidden_aro` (`hidden`)\n" .
78+
") ENGINE=InnoDB DEFAULT CHARSET=latin1";
79+
$parser = new Parser($query);
80+
$this->assertEquals($query, $parser->statements[0]->build());
6681
}
6782

6883
public function testBuilderPartitions()

tests/Misc/BugsTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public function testBugProvider()
2020
return array(
2121
array('bugs/gh9'),
2222
array('bugs/gh14'),
23+
array('bugs/gh16'),
2324
);
2425
}
2526
}

tests/data/bugs/gh16.in

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CREATE TABLE `jos_core_acl_aro` (
2+
`id` int(11) NOT NULL,
3+
`section_value` varchar(240) NOT NULL DEFAULT '0',
4+
`value` varchar(240) NOT NULL DEFAULT '',
5+
`order_value` int(11) NOT NULL DEFAULT '0',
6+
`name` varchar(255) NOT NULL DEFAULT '',
7+
`hidden` int(11) NOT NULL DEFAULT '0',
8+
PRIMARY KEY (`id`),
9+
UNIQUE KEY `jos_section_value_value_aro` (`section_value`(100),`value`(15)) USING BTREE,
10+
KEY `jos_gacl_hidden_aro` (`hidden`)
11+
) ENGINE=InnoDB DEFAULT CHARSET=latin1

tests/data/bugs/gh16.out

Lines changed: 31 additions & 0 deletions
Large diffs are not rendered by default.

tests/data/parser/parseCreateTable.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ a:4:{s:5:"query";s:229:"CREATE TABLE IF NOT EXISTS users (
1616
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:103;}i:29;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"`password`";s:5:"value";s:8:"password";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:108;}i:30;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:118;}i:31;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:119;}i:32;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:126;}i:33;O:15:"SqlParser\Token":5:{s:5:"token";s:3:"256";s:5:"value";i:256;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:127;}i:34;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:130;}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:131;}i:36;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:132;}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:139;}i:38;O:15:"SqlParser\Token":5:{s:5:"token";s:8:"'123456'";s:5:"value";s:6:"123456";s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:140;}i:39;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:148;}i:40;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
1717
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:149;}i:41;O:15:"SqlParser\Token":5:{s:5:"token";s:10:"CONSTRAINT";s:5:"value";s:10:"CONSTRAINT";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:154;}i:42;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:164;}i:43;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"pk_id";s:5:"value";s:5:"pk_id";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:165;}i:44;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:170;}i:45;O:15:"SqlParser\Token":5:{s:5:"token";s:11:"PRIMARY KEY";s:5:"value";s:11:"PRIMARY KEY";s:4:"type";i:1;s:5:"flags";i:23;s:8:"position";i:171;}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:182;}i:47;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:183;}i:48;O:15:"SqlParser\Token":5:{s:5:"token";s:4:"`id`";s:5:"value";s:2:"id";s:4:"type";i:8;s:5:"flags";i:2;s:8:"position";i:184;}i:49;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:188;}i:50;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:189;}i:51;O:15:"SqlParser\Token":5:{s:5:"token";s:5:"
1818
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:190;}i:52;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"UNIQUE";s:5:"value";s:6:"UNIQUE";s:4:"type";i:1;s:5:"flags";i:19;s:8:"position";i:195;}i:53;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:201;}i:54;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:202;}i:55;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:203;}i:56;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:211;}i:57;O:15:"SqlParser\Token":5:{s:5:"token";s:1:"
19-
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:212;}i:58;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:213;}i:59;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:60;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"ENGINE";s:5:"value";s:6:"ENGINE";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:215;}i:61;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:221;}i:62;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"InnoDB";s:5:"value";s:6:"InnoDB";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:222;}i:63;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:228;}i:64;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:65;s:3:"idx";i:65;}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:1:{i:0;O:36:"SqlParser\Statements\CreateStatement":15:{s:4:"name";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:5:"users";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:1:{i:1;a:4:{s:4:"name";s:6:"ENGINE";s:6:"equals";b:1;s:4:"expr";s:6:"InnoDB";s:5:"value";s:6:"InnoDB";}}}s:6:"fields";a:5:{i:0;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:2:"id";s:12:"isConstraint";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:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:1;s:8:"NOT NULL";i:3;s:14:"AUTO_INCREMENT";}}}i:1;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:8:"username";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:7:"VARCHAR";s:10:"parameters";a:1:{i:0;i:64;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:4:"NULL";}}}i:2;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:8:"password";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:7:"VARCHAR";s:10:"parameters";a:1:{i:0;i:256;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:2;a:4:{s:4:"name";s:7:"DEFAULT";s:6:"equals";b:0;s:4:"expr";s:8:"'123456'";s:5:"value";s:6:"123456";}}}}i:3;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:5:"pk_id";s:12:"isConstraint";b:1;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;s:2:"id";}s:4:"type";s:11:"PRIMARY KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:4;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;s:8:"username";}s:4:"type";s:6:"UNIQUE";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}}s:11:"partitionBy";N;s:13:"partitionsNum";N;s:14:"subpartitionBy";N;s:16:"subpartitionsNum";N;s:10:"partitions";N;s:5:"table";N;s:6:"return";N;s:10:"parameters";N;s:4:"body";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:6;s:5:"TABLE";i:7;s:13:"IF NOT EXISTS";}}s:5:"first";i:0;s:4:"last";i:63;}}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}
19+
";s:5:"value";s:1:" ";s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:212;}i:58;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:213;}i:59;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:60;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"ENGINE";s:5:"value";s:6:"ENGINE";s:4:"type";i:1;s:5:"flags";i:1;s:8:"position";i:215;}i:61;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:221;}i:62;O:15:"SqlParser\Token":5:{s:5:"token";s:6:"InnoDB";s:5:"value";s:6:"InnoDB";s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:222;}i:63;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:228;}i:64;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:65;s:3:"idx";i:65;}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:1:{i:0;O:36:"SqlParser\Statements\CreateStatement":15:{s:4:"name";O:31:"SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:5:"users";s:6:"column";N;s:4:"expr";s:5:"users";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:1:{i:1;a:4:{s:4:"name";s:6:"ENGINE";s:6:"equals";b:1;s:4:"expr";s:6:"InnoDB";s:5:"value";s:6:"InnoDB";}}}s:6:"fields";a:5:{i:0;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:2:"id";s:12:"isConstraint";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:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:1;s:8:"NOT NULL";i:3;s:14:"AUTO_INCREMENT";}}}i:1;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:8:"username";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:7:"VARCHAR";s:10:"parameters";a:1:{i:0;i:64;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:1;s:4:"NULL";}}}i:2;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:8:"password";s:12:"isConstraint";N;s:4:"type";O:29:"SqlParser\Components\DataType":3:{s:4:"name";s:7:"VARCHAR";s:10:"parameters";a:1:{i:0;i:256;}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:1:{i:2;a:4:{s:4:"name";s:7:"DEFAULT";s:6:"equals";b:0;s:4:"expr";s:8:"'123456'";s:5:"value";s:6:"123456";}}}}i:3;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";s:5:"pk_id";s:12:"isConstraint";b:1;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:2:"id";}}s:4:"type";s:11:"PRIMARY KEY";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}i:4;O:37:"SqlParser\Components\CreateDefinition":6:{s:4:"name";N;s:12:"isConstraint";N;s:4:"type";N;s:3:"key";O:24:"SqlParser\Components\Key":4:{s:4:"name";N;s:7:"columns";a:1:{i:0;a:1:{s:4:"name";s:8:"username";}}s:4:"type";s:6:"UNIQUE";s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:10:"references";N;s:7:"options";N;}}s:11:"partitionBy";N;s:13:"partitionsNum";N;s:14:"subpartitionBy";N;s:16:"subpartitionsNum";N;s:10:"partitions";N;s:5:"table";N;s:6:"return";N;s:10:"parameters";N;s:4:"body";a:0:{}s:7:"options";O:33:"SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:6;s:5:"TABLE";i:7;s:13:"IF NOT EXISTS";}}s:5:"first";i:0;s:4:"last";i:63;}}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}

0 commit comments

Comments
 (0)