Skip to content

Commit b3eff80

Browse files
committed
The context depends on the SQL mode.
Implemented a few more builders. Improved some fragments and statement types. Fixed the noAlias option in FieldFragment. Reordered CREATE statements's options. Updated contexts definitions. Fixed typos. Improved tests.
1 parent 4dabcc2 commit b3eff80

62 files changed

Lines changed: 1070 additions & 326 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/Context.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ abstract class Context
110110
'(' => 16, ')' => 16, '.' => 16, ',' => 16,
111111
);
112112

113+
/**
114+
* The mode of the MySQL server that will be used in lexing, parsing and
115+
* building the statements.
116+
*
117+
* @var int
118+
*/
119+
public static $MODE = 0;
120+
113121
/*
114122
* Server SQL Modes
115123
* https://dev.mysql.com/doc/refman/5.0/en/sql-mode.html
@@ -413,6 +421,44 @@ public static function load($context = '')
413421
self::$loadedContext = $context;
414422
self::$KEYWORDS = $context::$KEYWORDS;
415423
}
424+
425+
/**
426+
* Sets the SQL mode.
427+
*
428+
* @param string $mode The list of modes. If empty, the mode is reset.
429+
*/
430+
public static function setMode($mode = '')
431+
{
432+
static::$MODE = 0;
433+
if (empty($mode)) {
434+
return;
435+
}
436+
$mode = explode(',', $mode);
437+
foreach ($mode as $m) {
438+
static::$MODE |= constant('static::' . $m);
439+
}
440+
}
441+
442+
/**
443+
* Escapes the symbol by adding surrounding backticks.
444+
*
445+
* @param array|string $str The string to be escaped.
446+
*
447+
* @return string
448+
*/
449+
public static function escape($str)
450+
{
451+
if (is_array($str)) {
452+
foreach ($str as $key => $value) {
453+
$str[$key] = static::escape($value);
454+
}
455+
return $str;
456+
}
457+
if (static::$MODE & Context::ANSI_QUOTES) {
458+
return '"' . str_replace('"', '""', $str) . '"';
459+
}
460+
return '`' . str_replace('`', '``', $str) . '`';
461+
}
416462
}
417463

418464
// Initializng the default context.

src/Contexts/ContextMySql50000.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,14 @@ class ContextMySql50000 extends Context
143143
'MINUTE_MICROSECOND' => 3, 'NO_WRITE_TO_BINLOG' => 3, 'SECOND_MICROSECOND' => 3,
144144
'SQL_CALC_FOUND_ROWS' => 3,
145145

146-
'NOT NULL' => 5, 'SET NULL' => 5,
147-
'NO ACTION' => 5, 'ON DELETE' => 5, 'ON UPDATE' => 5,
148-
'CHARACTER SET' => 5, 'IF NOT EXISTS' => 5,
149-
'DATA DIRECTORY' => 5,
150-
'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5,
151-
'DEFAULT CHARACTER SET' => 5,
152-
153-
'GROUP BY' => 7, 'ORDER BY' => 7,
146+
'GROUP BY' => 7, 'NOT NULL' => 7, 'ORDER BY' => 7, 'SET NULL' => 7,
147+
'IF EXISTS' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7,
148+
'OR REPLACE' => 7,
149+
'SQL SECURITY' => 7,
150+
'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7,
151+
'DATA DIRECTORY' => 7,
152+
'DEFAULT COLLATE' => 7, 'INDEX DIRECTORY' => 7,
153+
'DEFAULT CHARACTER SET' => 7,
154154

155155
'XML' => 9,
156156
'ENUM' => 9, 'TEXT' => 9,
@@ -168,18 +168,18 @@ class ContextMySql50000 extends Context
168168
'CHARACTER' => 11, 'MEDIUMINT' => 11, 'VARBINARY' => 11,
169169
'MEDIUMBLOB' => 11, 'MEDIUMTEXT' => 11,
170170

171-
'BINARY VARYING' => 13,
171+
'BINARY VARYING' => 15,
172172

173173
'KEY' => 19,
174174
'INDEX' => 19,
175175
'UNIQUE' => 19,
176176

177-
'INDEX KEY' => 21,
178-
'UNIQUE KEY' => 21,
179-
'FOREIGN KEY' => 21, 'PRIMARY KEY' => 21, 'SPATIAL KEY' => 21,
180-
'FULLTEXT KEY' => 21, 'UNIQUE INDEX' => 21,
181-
'SPATIAL INDEX' => 21,
182-
'FULLTEXT INDEX' => 21,
177+
'INDEX KEY' => 23,
178+
'UNIQUE KEY' => 23,
179+
'FOREIGN KEY' => 23, 'PRIMARY KEY' => 23, 'SPATIAL KEY' => 23,
180+
'FULLTEXT KEY' => 23, 'UNIQUE INDEX' => 23,
181+
'SPATIAL INDEX' => 23,
182+
'FULLTEXT INDEX' => 23,
183183

184184
'X' => 33, 'Y' => 33,
185185
'LN' => 33, 'PI' => 33,
@@ -258,7 +258,7 @@ class ContextMySql50000 extends Context
258258
'LOCALTIMESTAMP' => 35,
259259
'CURRENT_TIMESTAMP' => 35,
260260

261-
'NOT IN' => 37,
261+
'NOT IN' => 39,
262262

263263
'DATE' => 41, 'TIME' => 41, 'YEAR' => 41,
264264
'TIMESTAMP' => 41,

src/Contexts/ContextMySql50100.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,14 @@ class ContextMySql50100 extends Context
154154
'SQL_CALC_FOUND_ROWS' => 3,
155155
'MASTER_SSL_VERIFY_SERVER_CERT' => 3,
156156

157-
'NOT NULL' => 5, 'SET NULL' => 5,
158-
'NO ACTION' => 5, 'ON DELETE' => 5, 'ON UPDATE' => 5,
159-
'CHARACTER SET' => 5, 'IF NOT EXISTS' => 5,
160-
'DATA DIRECTORY' => 5,
161-
'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5,
162-
'DEFAULT CHARACTER SET' => 5,
163-
164-
'GROUP BY' => 7, 'ORDER BY' => 7,
157+
'GROUP BY' => 7, 'NOT NULL' => 7, 'ORDER BY' => 7, 'SET NULL' => 7,
158+
'IF EXISTS' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7,
159+
'OR REPLACE' => 7,
160+
'SQL SECURITY' => 7,
161+
'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7,
162+
'DATA DIRECTORY' => 7,
163+
'DEFAULT COLLATE' => 7, 'INDEX DIRECTORY' => 7,
164+
'DEFAULT CHARACTER SET' => 7,
165165

166166
'XML' => 9,
167167
'ENUM' => 9, 'TEXT' => 9,
@@ -179,18 +179,18 @@ class ContextMySql50100 extends Context
179179
'CHARACTER' => 11, 'MEDIUMINT' => 11, 'VARBINARY' => 11,
180180
'MEDIUMBLOB' => 11, 'MEDIUMTEXT' => 11,
181181

182-
'BINARY VARYING' => 13,
182+
'BINARY VARYING' => 15,
183183

184184
'KEY' => 19,
185185
'INDEX' => 19,
186186
'UNIQUE' => 19,
187187

188-
'INDEX KEY' => 21,
189-
'UNIQUE KEY' => 21,
190-
'FOREIGN KEY' => 21, 'PRIMARY KEY' => 21, 'SPATIAL KEY' => 21,
191-
'FULLTEXT KEY' => 21, 'UNIQUE INDEX' => 21,
192-
'SPATIAL INDEX' => 21,
193-
'FULLTEXT INDEX' => 21,
188+
'INDEX KEY' => 23,
189+
'UNIQUE KEY' => 23,
190+
'FOREIGN KEY' => 23, 'PRIMARY KEY' => 23, 'SPATIAL KEY' => 23,
191+
'FULLTEXT KEY' => 23, 'UNIQUE INDEX' => 23,
192+
'SPATIAL INDEX' => 23,
193+
'FULLTEXT INDEX' => 23,
194194

195195
'X' => 33, 'Y' => 33,
196196
'LN' => 33, 'PI' => 33,
@@ -280,7 +280,7 @@ class ContextMySql50100 extends Context
280280
'LOCALTIMESTAMP' => 35,
281281
'CURRENT_TIMESTAMP' => 35,
282282

283-
'NOT IN' => 37,
283+
'NOT IN' => 39,
284284

285285
'DATE' => 41, 'TIME' => 41, 'YEAR' => 41,
286286
'TIMESTAMP' => 41,

src/Contexts/ContextMySql50500.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,14 @@ class ContextMySql50500 extends Context
159159
'SQL_CALC_FOUND_ROWS' => 3,
160160
'MASTER_SSL_VERIFY_SERVER_CERT' => 3,
161161

162-
'NOT NULL' => 5, 'SET NULL' => 5,
163-
'NO ACTION' => 5, 'ON DELETE' => 5, 'ON UPDATE' => 5,
164-
'CHARACTER SET' => 5, 'IF NOT EXISTS' => 5,
165-
'DATA DIRECTORY' => 5,
166-
'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5,
167-
'DEFAULT CHARACTER SET' => 5,
168-
169-
'GROUP BY' => 7, 'ORDER BY' => 7,
162+
'GROUP BY' => 7, 'NOT NULL' => 7, 'ORDER BY' => 7, 'SET NULL' => 7,
163+
'IF EXISTS' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7,
164+
'OR REPLACE' => 7,
165+
'SQL SECURITY' => 7,
166+
'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7,
167+
'DATA DIRECTORY' => 7,
168+
'DEFAULT COLLATE' => 7, 'INDEX DIRECTORY' => 7,
169+
'DEFAULT CHARACTER SET' => 7,
170170

171171
'XML' => 9,
172172
'ENUM' => 9, 'TEXT' => 9,
@@ -184,18 +184,18 @@ class ContextMySql50500 extends Context
184184
'CHARACTER' => 11, 'MEDIUMINT' => 11, 'VARBINARY' => 11,
185185
'MEDIUMBLOB' => 11, 'MEDIUMTEXT' => 11,
186186

187-
'BINARY VARYING' => 13,
187+
'BINARY VARYING' => 15,
188188

189189
'KEY' => 19,
190190
'INDEX' => 19,
191191
'UNIQUE' => 19,
192192

193-
'INDEX KEY' => 21,
194-
'UNIQUE KEY' => 21,
195-
'FOREIGN KEY' => 21, 'PRIMARY KEY' => 21, 'SPATIAL KEY' => 21,
196-
'FULLTEXT KEY' => 21, 'UNIQUE INDEX' => 21,
197-
'SPATIAL INDEX' => 21,
198-
'FULLTEXT INDEX' => 21,
193+
'INDEX KEY' => 23,
194+
'UNIQUE KEY' => 23,
195+
'FOREIGN KEY' => 23, 'PRIMARY KEY' => 23, 'SPATIAL KEY' => 23,
196+
'FULLTEXT KEY' => 23, 'UNIQUE INDEX' => 23,
197+
'SPATIAL INDEX' => 23,
198+
'FULLTEXT INDEX' => 23,
199199

200200
'X' => 33, 'Y' => 33,
201201
'LN' => 33, 'PI' => 33,
@@ -284,7 +284,7 @@ class ContextMySql50500 extends Context
284284
'LOCALTIMESTAMP' => 35,
285285
'CURRENT_TIMESTAMP' => 35,
286286

287-
'NOT IN' => 37,
287+
'NOT IN' => 39,
288288

289289
'DATE' => 41, 'TIME' => 41, 'YEAR' => 41,
290290
'TIMESTAMP' => 41,

src/Contexts/ContextMySql50600.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,14 @@ class ContextMySql50600 extends Context
165165
'SQL_CALC_FOUND_ROWS' => 3,
166166
'MASTER_SSL_VERIFY_SERVER_CERT' => 3,
167167

168-
'NOT NULL' => 5, 'SET NULL' => 5,
169-
'NO ACTION' => 5, 'ON DELETE' => 5, 'ON UPDATE' => 5,
170-
'CHARACTER SET' => 5, 'IF NOT EXISTS' => 5,
171-
'DATA DIRECTORY' => 5,
172-
'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5,
173-
'DEFAULT CHARACTER SET' => 5,
174-
175-
'GROUP BY' => 7, 'ORDER BY' => 7,
168+
'GROUP BY' => 7, 'NOT NULL' => 7, 'ORDER BY' => 7, 'SET NULL' => 7,
169+
'IF EXISTS' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7,
170+
'OR REPLACE' => 7,
171+
'SQL SECURITY' => 7,
172+
'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7,
173+
'DATA DIRECTORY' => 7,
174+
'DEFAULT COLLATE' => 7, 'INDEX DIRECTORY' => 7,
175+
'DEFAULT CHARACTER SET' => 7,
176176

177177
'XML' => 9,
178178
'ENUM' => 9, 'TEXT' => 9,
@@ -190,18 +190,18 @@ class ContextMySql50600 extends Context
190190
'CHARACTER' => 11, 'MEDIUMINT' => 11, 'VARBINARY' => 11,
191191
'MEDIUMBLOB' => 11, 'MEDIUMTEXT' => 11,
192192

193-
'BINARY VARYING' => 13,
193+
'BINARY VARYING' => 15,
194194

195195
'KEY' => 19,
196196
'INDEX' => 19,
197197
'UNIQUE' => 19,
198198

199-
'INDEX KEY' => 21,
200-
'UNIQUE KEY' => 21,
201-
'FOREIGN KEY' => 21, 'PRIMARY KEY' => 21, 'SPATIAL KEY' => 21,
202-
'FULLTEXT KEY' => 21, 'UNIQUE INDEX' => 21,
203-
'SPATIAL INDEX' => 21,
204-
'FULLTEXT INDEX' => 21,
199+
'INDEX KEY' => 23,
200+
'UNIQUE KEY' => 23,
201+
'FOREIGN KEY' => 23, 'PRIMARY KEY' => 23, 'SPATIAL KEY' => 23,
202+
'FULLTEXT KEY' => 23, 'UNIQUE INDEX' => 23,
203+
'SPATIAL INDEX' => 23,
204+
'FULLTEXT INDEX' => 23,
205205

206206
'X' => 33, 'Y' => 33,
207207
'LN' => 33, 'PI' => 33,
@@ -315,7 +315,7 @@ class ContextMySql50600 extends Context
315315
'LOCALTIMESTAMP' => 35,
316316
'CURRENT_TIMESTAMP' => 35,
317317

318-
'NOT IN' => 37,
318+
'NOT IN' => 39,
319319

320320
'DATE' => 41, 'TIME' => 41, 'YEAR' => 41,
321321
'TIMESTAMP' => 41,

src/Contexts/ContextMySql50700.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -173,14 +173,14 @@ class ContextMySql50700 extends Context
173173
'SQL_CALC_FOUND_ROWS' => 3,
174174
'MASTER_SSL_VERIFY_SERVER_CERT' => 3,
175175

176-
'NOT NULL' => 5, 'SET NULL' => 5,
177-
'NO ACTION' => 5, 'ON DELETE' => 5, 'ON UPDATE' => 5,
178-
'CHARACTER SET' => 5, 'IF NOT EXISTS' => 5,
179-
'DATA DIRECTORY' => 5,
180-
'DEFAULT COLLATE' => 5, 'INDEX DIRECTORY' => 5,
181-
'DEFAULT CHARACTER SET' => 5,
182-
183-
'GROUP BY' => 7, 'ORDER BY' => 7,
176+
'GROUP BY' => 7, 'NOT NULL' => 7, 'ORDER BY' => 7, 'SET NULL' => 7,
177+
'IF EXISTS' => 7, 'NO ACTION' => 7, 'ON DELETE' => 7, 'ON UPDATE' => 7,
178+
'OR REPLACE' => 7,
179+
'SQL SECURITY' => 7,
180+
'CHARACTER SET' => 7, 'IF NOT EXISTS' => 7,
181+
'DATA DIRECTORY' => 7,
182+
'DEFAULT COLLATE' => 7, 'INDEX DIRECTORY' => 7,
183+
'DEFAULT CHARACTER SET' => 7,
184184

185185
'XML' => 9,
186186
'ENUM' => 9, 'TEXT' => 9,
@@ -198,18 +198,18 @@ class ContextMySql50700 extends Context
198198
'CHARACTER' => 11, 'MEDIUMINT' => 11, 'VARBINARY' => 11,
199199
'MEDIUMBLOB' => 11, 'MEDIUMTEXT' => 11,
200200

201-
'BINARY VARYING' => 13,
201+
'BINARY VARYING' => 15,
202202

203203
'KEY' => 19,
204204
'INDEX' => 19,
205205
'UNIQUE' => 19,
206206

207-
'INDEX KEY' => 21,
208-
'UNIQUE KEY' => 21,
209-
'FOREIGN KEY' => 21, 'PRIMARY KEY' => 21, 'SPATIAL KEY' => 21,
210-
'FULLTEXT KEY' => 21, 'UNIQUE INDEX' => 21,
211-
'SPATIAL INDEX' => 21,
212-
'FULLTEXT INDEX' => 21,
207+
'INDEX KEY' => 23,
208+
'UNIQUE KEY' => 23,
209+
'FOREIGN KEY' => 23, 'PRIMARY KEY' => 23, 'SPATIAL KEY' => 23,
210+
'FULLTEXT KEY' => 23, 'UNIQUE INDEX' => 23,
211+
'SPATIAL INDEX' => 23,
212+
'FULLTEXT INDEX' => 23,
213213

214214
'X' => 33, 'Y' => 33,
215215
'LN' => 33, 'PI' => 33,
@@ -327,7 +327,7 @@ class ContextMySql50700 extends Context
327327
'LOCALTIMESTAMP' => 35,
328328
'CURRENT_TIMESTAMP' => 35,
329329

330-
'NOT IN' => 37,
330+
'NOT IN' => 39,
331331

332332
'DATE' => 41, 'TIME' => 41, 'YEAR' => 41,
333333
'TIMESTAMP' => 41,

0 commit comments

Comments
 (0)