Skip to content

Commit 440f059

Browse files
committed
simplify the tests and support NOT ENFORCED
Signed-off-by: Fawzi E. Abdulfattah <iifawzie@gmail.com>
1 parent 60d101d commit 440f059

12 files changed

+134
-15
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
- Fix PHP notice "Undefined index: name in src/Components/Key.php#206" for table keys using functions (#347)
1111
- Fix MySQL 8.0 table structure KEY expression not recognized (#347)
1212
- Fix KEY order (ASC/DESC) not part of the KEY definition (#296)
13+
- Fix missing KEY options for MySQL and MariaDB (#348)
1314

1415
## [4.7.2] - 2021-02-05
1516

src/Components/CreateDefinition.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class CreateDefinition extends Component
8787
),
8888
'INVISIBLE' => 13,
8989
'ENFORCED' => 14,
90+
'NOT' => 15,
9091
// Common entries.
9192
//
9293
// NOTE: Some of the common options are not in the same order which

src/Components/Key.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class Key extends Component
3131
public static $KEY_OPTIONS = array(
3232
'KEY_BLOCK_SIZE' => array(
3333
1,
34-
'var',
34+
'var=',
3535
),
3636
'USING' => array(
3737
2,
@@ -44,7 +44,26 @@ class Key extends Component
4444
'COMMENT' => array(
4545
4,
4646
'var',
47-
)
47+
),
48+
// MariaDB options
49+
'CLUSTERING' => array(
50+
4,
51+
'var=',
52+
),
53+
'ENGINE_ATTRIBUTE' => array(
54+
5,
55+
'var=',
56+
),
57+
'SECONDARY_ENGINE_ATTRIBUTE' => array(
58+
5,
59+
'var=',
60+
),
61+
// MariaDB & MySQL options
62+
'VISIBLE' => 6,
63+
'INVISIBLE' => 6,
64+
// MariaDB options
65+
'IGNORED' => 10,
66+
'NOT IGNORED' => 10,
4867
);
4968

5069
/**

tests/Components/KeyTest.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,65 @@ public function testParseKeyWithLengthWithOptions()
170170
);
171171
}
172172

173+
public function testParseKeyWithLengthWithAllOptions()
174+
{
175+
$component = Key::parse(
176+
new Parser(),
177+
$this->getTokensList(
178+
// This is not a vary plausible example but it runs
179+
// Only ENGINE_ATTRIBUTE gives a not supported error but is still a valid syntax
180+
'KEY `alias_type_idx` (`alias_type`(10))'
181+
. ' COMMENT \'my comment\' VISIBLE KEY_BLOCK_SIZE=1'
182+
. ' INVISIBLE ENGINE_ATTRIBUTE \'foo\' SECONDARY_ENGINE_ATTRIBUTE=\'bar\' USING BTREE,'
183+
)
184+
);
185+
$this->assertEquals('KEY', $component->type);
186+
$this->assertEquals('alias_type_idx', $component->name);
187+
$this->assertEquals(new OptionsArray(
188+
array(
189+
1 => array(
190+
'name' => 'KEY_BLOCK_SIZE',
191+
'equals' => true,
192+
'expr' => '1',
193+
'value' => '1',
194+
),
195+
2 => array(
196+
'name' => 'USING',
197+
'equals' => false,
198+
'expr' => 'BTREE',
199+
'value' => 'BTREE',
200+
),
201+
4 => array(
202+
'name' => 'COMMENT',
203+
'equals' => false,
204+
'expr' => '\'my comment\'',
205+
'value' => 'my comment',
206+
),
207+
5 => array(
208+
'name' => 'ENGINE_ATTRIBUTE',
209+
'equals' => true,
210+
'expr' => '\'foo\'',
211+
'value' => 'foo',
212+
),
213+
6 => 'VISIBLE',
214+
12 => 'INVISIBLE',
215+
13 => array(
216+
'name' => 'SECONDARY_ENGINE_ATTRIBUTE',
217+
'equals' => true,
218+
'expr' => '\'bar\'',
219+
'value' => 'bar',
220+
),
221+
)
222+
), $component->options);
223+
$this->assertNull($component->expr);
224+
$this->assertSame(array(
225+
array(
226+
'name' => 'alias_type',
227+
'length' => 10,
228+
)
229+
), $component->columns);
230+
}
231+
173232
public function testParseKeyExpressionWithoutOptions()
174233
{
175234
$component = Key::parse(

tests/Parser/CreateStatementTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ public function createProvider()
4747
array('parser/parseCreateTableLike'),
4848
array('parser/parseCreateTableSpatial'),
4949
array('parser/parseCreateTableTimestampWithPrecision'),
50+
array('parser/parseCreateTableEnforcedCheck'),
51+
array('parser/parseCreateTableNotEnforcedCheck'),
52+
array('parser/parseCreateTableWithInvisibleKey'),
5053
array('parser/parseCreateTrigger'),
5154
array('parser/parseCreateUser'),
5255
array('parser/parseCreateView'),
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1 @@
1-
CREATE DATABASE IF NOT EXISTS cbt_triggers;
2-
USE cbt_triggers;
3-
DROP TABLE IF EXISTS employees_check;
41
CREATE TABLE IF NOT EXISTS employees_check (FirstName varchar(30) CHECK (FirstName REGEXP '^T' AND FirstName REGEXP 'r$') ENFORCED);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
a:4:{s:5:"query";s:132:"CREATE TABLE IF NOT EXISTS employees_check (FirstName varchar(30) CHECK (FirstName REGEXP '^T' AND FirstName REGEXP 'r$') ENFORCED);";s:5:"lexer";O:26:"PhpMyAdmin\SqlParser\Lexer":8:{s:3:"str";s:132:"CREATE TABLE IF NOT EXISTS employees_check (FirstName varchar(30) CHECK (FirstName REGEXP '^T' AND FirstName REGEXP 'r$') ENFORCED);";s:3:"len";i:132;s:4:"last";i:132;s:4:"list";O:31:"PhpMyAdmin\SqlParser\TokensList":3:{s:6:"tokens";a:38:{i:0;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"CREATE";s:5:"value";s:6:"CREATE";s:7:"keyword";s:6:"CREATE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:0;}i:1;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:6;}i:2;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"TABLE";s:5:"value";s:5:"TABLE";s:7:"keyword";s:5:"TABLE";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:7;}i:3;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:12;}i:4;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:13:"IF NOT EXISTS";s:5:"value";s:13:"IF NOT EXISTS";s:7:"keyword";s:13:"IF NOT EXISTS";s:4:"type";i:1;s:5:"flags";i:7;s:8:"position";i:13;}i:5;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:26;}i:6;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:15:"employees_check";s:5:"value";s:15:"employees_check";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:27;}i:7;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:42;}i:8;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:43;}i:9;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:9:"FirstName";s:5:"value";s:9:"FirstName";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:44;}i:10;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:53;}i:11;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:7:"varchar";s:5:"value";s:7:"VARCHAR";s:7:"keyword";s:7:"VARCHAR";s:4:"type";i:1;s:5:"flags";i:11;s:8:"position";i:54;}i:12;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:61;}i:13;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:2:"30";s:5:"value";i:30;s:7:"keyword";N;s:4:"type";i:6;s:5:"flags";i:0;s:8:"position";i:62;}i:14;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:64;}i:15;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:65;}i:16;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:5:"CHECK";s:5:"value";s:5:"CHECK";s:7:"keyword";s:5:"CHECK";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:66;}i:17;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:71;}i:18;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:"(";s:5:"value";s:1:"(";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:72;}i:19;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:9:"FirstName";s:5:"value";s:9:"FirstName";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:73;}i:20;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:82;}i:21;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"REGEXP";s:5:"value";s:6:"REGEXP";s:7:"keyword";s:6:"REGEXP";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:83;}i:22;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:89;}i:23;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"'^T'";s:5:"value";s:2:"^T";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:90;}i:24;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:94;}i:25;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:3:"AND";s:5:"value";s:3:"AND";s:7:"keyword";s:3:"AND";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:95;}i:26;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:98;}i:27;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:9:"FirstName";s:5:"value";s:9:"FirstName";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:99;}i:28;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:108;}i:29;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:6:"REGEXP";s:5:"value";s:6:"REGEXP";s:7:"keyword";s:6:"REGEXP";s:4:"type";i:1;s:5:"flags";i:3;s:8:"position";i:109;}i:30;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:115;}i:31;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:4:"'r$'";s:5:"value";s:2:"r$";s:7:"keyword";N;s:4:"type";i:7;s:5:"flags";i:1;s:8:"position";i:116;}i:32;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:120;}i:33;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:" ";s:5:"value";s:1:" ";s:7:"keyword";N;s:4:"type";i:3;s:5:"flags";i:0;s:8:"position";i:121;}i:34;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:8:"ENFORCED";s:5:"value";s:8:"ENFORCED";s:7:"keyword";N;s:4:"type";i:0;s:5:"flags";i:0;s:8:"position";i:122;}i:35;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:")";s:5:"value";s:1:")";s:7:"keyword";N;s:4:"type";i:2;s:5:"flags";i:16;s:8:"position";i:130;}i:36;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";s:1:";";s:5:"value";s:1:";";s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";i:131;}i:37;O:26:"PhpMyAdmin\SqlParser\Token":6:{s:5:"token";N;s:5:"value";N;s:7:"keyword";N;s:4:"type";i:9;s:5:"flags";i:0;s:8:"position";N;}}s:5:"count";i:38;s:3:"idx";i:38;}s:9:"delimiter";s:1:";";s:12:"delimiterLen";i:1;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"parser";O:27:"PhpMyAdmin\SqlParser\Parser":5:{s:4:"list";r:7;s:10:"statements";a:1:{i:0;O:47:"PhpMyAdmin\SqlParser\Statements\CreateStatement":17:{s:4:"name";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";s:15:"employees_check";s:6:"column";N;s:4:"expr";s:15:"employees_check";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:13:"entityOptions";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}s:6:"fields";a:1:{i:0;O:48:"PhpMyAdmin\SqlParser\Components\CreateDefinition":6:{s:4:"name";s:9:"FirstName";s:12:"isConstraint";N;s:4:"type";O:40:"PhpMyAdmin\SqlParser\Components\DataType":3:{s:4:"name";s:7:"VARCHAR";s:10:"parameters";a:1:{i:0;s:2:"30";}s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:0:{}}}s:3:"key";N;s:10:"references";N;s:7:"options";O:44:"PhpMyAdmin\SqlParser\Components\OptionsArray":1:{s:7:"options";a:2:{i:12;a:4:{s:4:"name";s:5:"CHECK";s:6:"equals";b:0;s:4:"expr";O:42:"PhpMyAdmin\SqlParser\Components\Expression":7:{s:8:"database";N;s:5:"table";N;s:6:"column";N;s:4:"expr";s:49:"(FirstName REGEXP '^T' AND FirstName REGEXP 'r$')";s:5:"alias";N;s:8:"function";N;s:8:"subquery";N;}s:5:"value";s:49:"(FirstName REGEXP '^T' AND FirstName REGEXP 'r$')";}i:14;s:8:"ENFORCED";}}}}s:6:"select";N;s:4:"like";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:44:"PhpMyAdmin\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:36;}}s:8:"brackets";i:0;s:6:"strict";b:0;s:6:"errors";a:0:{}}s:6:"errors";a:2:{s:5:"lexer";a:0:{}s:6:"parser";a:0:{}}}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CREATE TABLE IF NOT EXISTS employees_check (FirstName varchar(30) CHECK (FirstName REGEXP '^T' AND FirstName REGEXP 'r$') NOT ENFORCED);

0 commit comments

Comments
 (0)