1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Graze\Morphism\Parse; |
4
|
|
|
|
5
|
|
|
use Exception; |
6
|
|
|
use Graze\Morphism\Test\Parse\TestCase; |
7
|
|
|
use RuntimeException; |
8
|
|
|
|
9
|
|
|
class ColumnDefinitionTest extends TestCase |
10
|
|
|
{ |
11
|
|
|
/** |
12
|
|
|
* @dataProvider parseDatatypesProvider |
13
|
|
|
* @param string $text |
14
|
|
|
* @param string $expected |
15
|
|
|
*/ |
16
|
|
|
public function testParseDatatypes($text, $expected) |
17
|
|
|
{ |
18
|
|
|
$stream = $this->makeStream($text); |
19
|
|
|
$collation = new CollationInfo(); |
20
|
|
|
|
21
|
|
|
$column = new ColumnDefinition(); |
22
|
|
|
$column->parse($stream); |
23
|
|
|
|
24
|
|
|
$this->assertSame($expected, $column->toString($collation)); |
25
|
|
|
} |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* @return array |
29
|
|
|
*/ |
30
|
|
|
public function parseDatatypesProvider() |
31
|
|
|
{ |
32
|
|
|
return [ |
33
|
|
|
["x int", "`x` int DEFAULT NULL"], |
34
|
|
|
["x int signed", "`x` int DEFAULT NULL"], |
35
|
|
|
["x int unsigned", "`x` int unsigned DEFAULT NULL"], |
36
|
|
|
["x int(5)", "`x` int DEFAULT NULL"], |
37
|
|
|
["x int(5) default null", "`x` int DEFAULT NULL"], |
38
|
|
|
["x int not null default 1", "`x` int NOT NULL DEFAULT '1'"], |
39
|
|
|
["x int default 1", "`x` int DEFAULT '1'"], |
40
|
|
|
["x int auto_increment", "`x` int NOT NULL AUTO_INCREMENT"], |
41
|
|
|
["x int comment 'blah'", "`x` int DEFAULT NULL COMMENT 'blah'"], |
42
|
|
|
["x int serial default value", "`x` int NOT NULL AUTO_INCREMENT"], |
43
|
|
|
|
44
|
|
|
["x int primary key", "`x` int NOT NULL"], |
45
|
|
|
["x int key", "`x` int NOT NULL"], |
46
|
|
|
["x int unique", "`x` int DEFAULT NULL"], |
47
|
|
|
["x int unique key", "`x` int DEFAULT NULL"], |
48
|
|
|
|
49
|
|
|
["x bit", "`x` bit DEFAULT NULL"], |
50
|
|
|
["x bit(4)", "`x` bit(4) DEFAULT NULL"], |
51
|
|
|
["x bit(4) default 4", "`x` bit(4) DEFAULT b'100'"], |
52
|
|
|
["x bit(4) default b'0101'", "`x` bit(4) DEFAULT b'101'"], |
53
|
|
|
["x bit(8) default x'e4'", "`x` bit(8) DEFAULT b'11100100'"], |
54
|
|
|
|
55
|
|
|
["x tinyint", "`x` tinyint DEFAULT NULL"], |
56
|
|
|
["x tinyint unsigned", "`x` tinyint unsigned DEFAULT NULL"], |
57
|
|
|
["x smallint", "`x` smallint DEFAULT NULL"], |
58
|
|
|
["x smallint unsigned", "`x` smallint unsigned DEFAULT NULL"], |
59
|
|
|
["x mediumint", "`x` mediumint DEFAULT NULL"], |
60
|
|
|
["x mediumint unsigned", "`x` mediumint unsigned DEFAULT NULL"], |
61
|
|
|
["x bigint", "`x` bigint DEFAULT NULL"], |
62
|
|
|
["x bigint unsigned", "`x` bigint unsigned DEFAULT NULL"], |
63
|
|
|
|
64
|
|
|
["x double", "`x` double DEFAULT NULL"], |
65
|
|
|
["x double unsigned", "`x` double unsigned DEFAULT NULL"], |
66
|
|
|
["x double(12,4)", "`x` double(12,4) DEFAULT NULL"], |
67
|
|
|
|
68
|
|
|
["x float", "`x` float DEFAULT NULL"], |
69
|
|
|
["x float unsigned", "`x` float unsigned DEFAULT NULL"], |
70
|
|
|
["x float(8,3)", "`x` float(8,3) DEFAULT NULL"], |
71
|
|
|
|
72
|
|
|
["x decimal", "`x` decimal(10,0) DEFAULT NULL"], |
73
|
|
|
["x decimal unsigned", "`x` decimal(10,0) unsigned DEFAULT NULL"], |
74
|
|
|
["x decimal(8)", "`x` decimal(8,0) DEFAULT NULL"], |
75
|
|
|
["x decimal(8,3)", "`x` decimal(8,3) DEFAULT NULL"], |
76
|
|
|
["x decimal default 1", "`x` decimal(10,0) DEFAULT '1'"], |
77
|
|
|
["x decimal(5,3) default 1", "`x` decimal(5,3) DEFAULT '1.000'"], |
78
|
|
|
["x decimal(7,3) unsigned default 1", "`x` decimal(7,3) unsigned DEFAULT '1.000'"], |
79
|
|
|
|
80
|
|
|
["x date", "`x` date DEFAULT NULL"], |
81
|
|
|
["x date default 0", "`x` date DEFAULT '0000-00-00'"], |
82
|
|
|
["x date default '1970-08-12'", "`x` date DEFAULT '1970-08-12'"], |
83
|
|
|
|
84
|
|
|
["x time", "`x` time DEFAULT NULL"], |
85
|
|
|
["x time default 0", "`x` time DEFAULT '00:00:00'"], |
86
|
|
|
["x time default '23:59:59'", "`x` time DEFAULT '23:59:59'"], |
87
|
|
|
|
88
|
|
|
["x datetime", "`x` datetime DEFAULT NULL"], |
89
|
|
|
["x datetime default 0", "`x` datetime DEFAULT '0000-00-00 00:00:00'"], |
90
|
|
|
["x datetime default '1970-08-12 23:58:57'", "`x` datetime DEFAULT '1970-08-12 23:58:57'"], |
91
|
|
|
["x datetime default current_timestamp", "`x` datetime DEFAULT CURRENT_TIMESTAMP"], |
92
|
|
|
["x datetime on update current_timestamp", "`x` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP"], |
93
|
|
|
["x datetime default current_timestamp on update current_timestamp", |
94
|
|
|
"`x` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"], |
95
|
|
|
["x datetime default current_timestamp default_generated on update current_timestamp", |
96
|
|
|
"`x` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"], |
97
|
|
|
|
98
|
|
|
["x timestamp", "`x` timestamp NOT NULL"], |
99
|
|
|
["x timestamp default 0", "`x` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'"], |
100
|
|
|
["x timestamp default '1970-08-12 19:18:17'", "`x` timestamp NOT NULL DEFAULT '1970-08-12 19:18:17'"], |
101
|
|
|
["x timestamp default current_timestamp", "`x` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"], |
102
|
|
|
["x timestamp default localtime", "`x` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"], |
103
|
|
|
["x timestamp default localtimestamp", "`x` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"], |
104
|
|
|
["x timestamp default now()", "`x` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"], |
105
|
|
|
["x timestamp on update current_timestamp", "`x` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP"], |
106
|
|
|
["x timestamp on update localtime", "`x` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP"], |
107
|
|
|
["x timestamp on update localtimestamp", "`x` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP"], |
108
|
|
|
["x timestamp on update now()", "`x` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP"], |
109
|
|
|
["x timestamp default current_timestamp on update current_timestamp", |
110
|
|
|
"`x` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"], |
111
|
|
|
["x timestamp on update current_timestamp default current_timestamp", |
112
|
|
|
"`x` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"], |
113
|
|
|
|
114
|
|
|
["x year", "`x` year(4) DEFAULT NULL"], |
115
|
|
|
["x year(4)", "`x` year(4) DEFAULT NULL"], |
116
|
|
|
["x year default 0", "`x` year(4) DEFAULT '0000'"], |
117
|
|
|
["x year default '0'", "`x` year(4) DEFAULT '2000'"], |
118
|
|
|
["x year default 69", "`x` year(4) DEFAULT '2069'"], |
119
|
|
|
["x year default 70", "`x` year(4) DEFAULT '1970'"], |
120
|
|
|
["x year default 99", "`x` year(4) DEFAULT '1999'"], |
121
|
|
|
["x year default 1901","`x` year(4) DEFAULT '1901'"], |
122
|
|
|
["x year default 2155","`x` year(4) DEFAULT '2155'"], |
123
|
|
|
|
124
|
|
|
["x char", "`x` char(1) DEFAULT NULL"], |
125
|
|
|
["x char(4)", "`x` char(4) DEFAULT NULL"], |
126
|
|
|
|
127
|
|
|
["x varchar(255)", "`x` varchar(255) DEFAULT NULL"], |
128
|
|
|
|
129
|
|
|
["x binary", "`x` binary(1) DEFAULT NULL"], |
130
|
|
|
["x binary(255)", "`x` binary(255) DEFAULT NULL"], |
131
|
|
|
["x binary default 'a'", "`x` binary(1) DEFAULT 'a'"], |
132
|
|
|
|
133
|
|
|
["x varbinary(255)", "`x` varbinary(255) DEFAULT NULL"], |
134
|
|
|
|
135
|
|
|
["x tinyblob", "`x` tinyblob"], |
136
|
|
|
["x tinyblob NULL", "`x` tinyblob"], |
137
|
|
|
["x tinyblob NOT NULL", "`x` tinyblob NOT NULL"], |
138
|
|
|
|
139
|
|
|
["x blob", "`x` blob"], |
140
|
|
|
["x blob NULL", "`x` blob"], |
141
|
|
|
["x blob NOT NULL", "`x` blob NOT NULL"], |
142
|
|
|
|
143
|
|
|
["x mediumblob", "`x` mediumblob"], |
144
|
|
|
["x mediumblob NULL", "`x` mediumblob"], |
145
|
|
|
["x mediumblob NOT NULL", "`x` mediumblob NOT NULL"], |
146
|
|
|
|
147
|
|
|
["x longblob", "`x` longblob"], |
148
|
|
|
["x longblob NULL", "`x` longblob"], |
149
|
|
|
["x longblob NOT NULL", "`x` longblob NOT NULL"], |
150
|
|
|
|
151
|
|
|
["x tinytext", "`x` tinytext"], |
152
|
|
|
["x tinytext NULL", "`x` tinytext"], |
153
|
|
|
["x tinytext NOT NULL", "`x` tinytext NOT NULL"], |
154
|
|
|
|
155
|
|
|
["x text", "`x` text"], |
156
|
|
|
["x text NULL", "`x` text"], |
157
|
|
|
["x text NOT NULL", "`x` text NOT NULL"], |
158
|
|
|
["x text binary", "`x` text"], |
159
|
|
|
["x text charset utf8", "`x` text CHARACTER SET utf8"], |
160
|
|
|
["x text collate utf8_unicode_ci", "`x` text CHARACTER SET utf8 COLLATE utf8_unicode_ci"], |
161
|
|
|
|
162
|
|
|
["x mediumtext", "`x` mediumtext"], |
163
|
|
|
["x mediumtext NULL", "`x` mediumtext"], |
164
|
|
|
["x mediumtext NOT NULL", "`x` mediumtext NOT NULL"], |
165
|
|
|
|
166
|
|
|
["x longtext", "`x` longtext"], |
167
|
|
|
["x longtext NULL", "`x` longtext"], |
168
|
|
|
["x longtext NOT NULL", "`x` longtext NOT NULL"], |
169
|
|
|
|
170
|
|
|
["x varchar(3) default 'abc'", "`x` varchar(3) DEFAULT 'abc'"], |
171
|
|
|
|
172
|
|
|
["x enum('a', 'b', 'c')", "`x` enum('a','b','c') DEFAULT NULL"], |
173
|
|
|
["x enum('a', 'b', 'c') DEFAULT 'b'", "`x` enum('a','b','c') DEFAULT 'b'"], |
174
|
|
|
["x enum('a', 'b', 'c') NOT NULL", "`x` enum('a','b','c') NOT NULL"], |
175
|
|
|
|
176
|
|
|
["x set('a', 'b', 'c')", "`x` set('a','b','c') DEFAULT NULL"], |
177
|
|
|
["x set('a', 'b', 'c') DEFAULT 'a,c'", "`x` set('a','b','c') DEFAULT 'a,c'"], |
178
|
|
|
["x set('a', 'b', 'c') NOT NULL", "`x` set('a','b','c') NOT NULL"], |
179
|
|
|
["x set('a', 'b', 'c') default ''", "`x` set('a','b','c') DEFAULT ''"], |
180
|
|
|
|
181
|
|
|
["x serial", "`x` bigint unsigned NOT NULL AUTO_INCREMENT"], |
182
|
|
|
|
183
|
|
|
["x character", "`x` char(1) DEFAULT NULL"], |
184
|
|
|
["x character(10)", "`x` char(10) DEFAULT NULL"], |
185
|
|
|
["x character varying(100)", "`x` varchar(100) DEFAULT NULL"], |
186
|
|
|
|
187
|
|
|
["x double precision", "`x` double DEFAULT NULL"], |
188
|
|
|
["x double precision unsigned", "`x` double unsigned DEFAULT NULL"], |
189
|
|
|
["x double precision(12,4)", "`x` double(12,4) DEFAULT NULL"], |
190
|
|
|
|
191
|
|
|
["x long varbinary", "`x` mediumblob"], |
192
|
|
|
["x long varchar", "`x` mediumtext"], |
193
|
|
|
["x long", "`x` mediumtext"], |
194
|
|
|
|
195
|
|
|
["x bool", "`x` tinyint DEFAULT NULL"], |
196
|
|
|
["x boolean", "`x` tinyint DEFAULT NULL"], |
197
|
|
|
["x bool NOT NULL", "`x` tinyint NOT NULL"], |
198
|
|
|
["x boolean NOT NULL", "`x` tinyint NOT NULL"], |
199
|
|
|
|
200
|
|
|
["x int1", "`x` tinyint DEFAULT NULL"], |
201
|
|
|
["x int1(3)", "`x` tinyint DEFAULT NULL"], |
202
|
|
|
["x int1 NOT NULL", "`x` tinyint NOT NULL"], |
203
|
|
|
|
204
|
|
|
["x int2", "`x` smallint DEFAULT NULL"], |
205
|
|
|
["x int2(3)", "`x` smallint DEFAULT NULL"], |
206
|
|
|
["x int2 NOT NULL", "`x` smallint NOT NULL"], |
207
|
|
|
|
208
|
|
|
["x int3", "`x` mediumint DEFAULT NULL"], |
209
|
|
|
["x int3(3)", "`x` mediumint DEFAULT NULL"], |
210
|
|
|
["x int3 NOT NULL", "`x` mediumint NOT NULL"], |
211
|
|
|
|
212
|
|
|
["x middleint", "`x` mediumint DEFAULT NULL"], |
213
|
|
|
["x middleint(3)", "`x` mediumint DEFAULT NULL"], |
214
|
|
|
["x middleint NOT NULL", "`x` mediumint NOT NULL"], |
215
|
|
|
|
216
|
|
|
["x int4", "`x` int DEFAULT NULL"], |
217
|
|
|
["x int4(3)", "`x` int DEFAULT NULL"], |
218
|
|
|
["x int4 NOT NULL", "`x` int NOT NULL"], |
219
|
|
|
|
220
|
|
|
["x integer", "`x` int DEFAULT NULL"], |
221
|
|
|
["x integer(3)", "`x` int DEFAULT NULL"], |
222
|
|
|
["x integer NOT NULL", "`x` int NOT NULL"], |
223
|
|
|
|
224
|
|
|
["x int8", "`x` bigint DEFAULT NULL"], |
225
|
|
|
["x int8(3)", "`x` bigint DEFAULT NULL"], |
226
|
|
|
["x int8 NOT NULL", "`x` bigint NOT NULL"], |
227
|
|
|
|
228
|
|
|
["x dec", "`x` decimal(10,0) DEFAULT NULL"], |
229
|
|
|
["x dec(8)", "`x` decimal(8,0) DEFAULT NULL"], |
230
|
|
|
["x dec(8,3)", "`x` decimal(8,3) DEFAULT NULL"], |
231
|
|
|
["x dec NOT NULL", "`x` decimal(10,0) NOT NULL"], |
232
|
|
|
|
233
|
|
|
["x numeric", "`x` decimal(10,0) DEFAULT NULL"], |
234
|
|
|
["x numeric(8)", "`x` decimal(8,0) DEFAULT NULL"], |
235
|
|
|
["x numeric(8,3)", "`x` decimal(8,3) DEFAULT NULL"], |
236
|
|
|
["x numeric NOT NULL", "`x` decimal(10,0) NOT NULL"], |
237
|
|
|
|
238
|
|
|
["x fixed", "`x` decimal(10,0) DEFAULT NULL"], |
239
|
|
|
["x fixed(8)", "`x` decimal(8,0) DEFAULT NULL"], |
240
|
|
|
["x fixed(8,3)", "`x` decimal(8,3) DEFAULT NULL"], |
241
|
|
|
["x fixed NOT NULL", "`x` decimal(10,0) NOT NULL"], |
242
|
|
|
|
243
|
|
|
["x real", "`x` double DEFAULT NULL"], |
244
|
|
|
["x real(8,3)", "`x` double(8,3) DEFAULT NULL"], |
245
|
|
|
|
246
|
|
|
["x json", "`x` json"], |
247
|
|
|
["x json NULL", "`x` json"], |
248
|
|
|
["x json NOT NULL", "`x` json NOT NULL"], |
249
|
|
|
|
250
|
|
|
// Ignore unrecognised column options |
251
|
|
|
["x int foo", "`x` int DEFAULT NULL"], |
252
|
|
|
]; |
253
|
|
|
} |
254
|
|
|
|
255
|
|
|
/** |
256
|
|
|
* @param string $text |
257
|
|
|
* @dataProvider parseInvalidDatatypesProvider |
258
|
|
|
* @expectedException RuntimeException |
259
|
|
|
*/ |
260
|
|
|
public function testParseInvalidDatatypes($text) |
261
|
|
|
{ |
262
|
|
|
$stream = $this->makeStream($text); |
263
|
|
|
$column = new ColumnDefinition(); |
264
|
|
|
$column->parse($stream); |
265
|
|
|
} |
266
|
|
|
|
267
|
|
|
/** |
268
|
|
|
* @return array |
269
|
|
|
*/ |
270
|
|
|
public function parseInvalidDatatypesProvider() |
271
|
|
|
{ |
272
|
|
|
return [ |
273
|
|
|
// Invalid type |
274
|
|
|
["x foo"], |
275
|
|
|
// Another invalid type |
276
|
|
|
["x null"], |
277
|
|
|
// No identifier |
278
|
|
|
["int"], |
279
|
|
|
// Unexpected ZEROFILL keyword |
280
|
|
|
["x int zerofill"], |
281
|
|
|
// No comma separator |
282
|
|
|
["x set('a'|'b')"], |
283
|
|
|
// Unexpected parentheses |
284
|
|
|
["x text ()"], |
285
|
|
|
// Unexpected comma |
286
|
|
|
["x year (1,)"], |
287
|
|
|
// No comma separator |
288
|
|
|
["x double(1 2)"], |
289
|
|
|
// No parentheses |
290
|
|
|
["x varchar"], |
291
|
|
|
// Unexpected ZEROFILL keyword |
292
|
|
|
["x date zerofill"], |
293
|
|
|
// Unexpected UNSIGNED keyword |
294
|
|
|
["x date unsigned"], |
295
|
|
|
// Unexpected SIGNED keyword |
296
|
|
|
["x date signed"], |
297
|
|
|
// Unexpected BINARY keyword |
298
|
|
|
["x date binary"], |
299
|
|
|
// Unexpected CHARSET keyword |
300
|
|
|
["x date charset"], |
301
|
|
|
// Unexpected COLLATE keyword |
302
|
|
|
["x date collate"], |
303
|
|
|
// Unexpected AUTO_INCREMENT keyword |
304
|
|
|
["x date auto_increment"], |
305
|
|
|
// Unexpected SERIAL DEFAULT VALUE keywords |
306
|
|
|
["x date serial default value"], |
307
|
|
|
// Invalid year length |
308
|
|
|
["x year(1)"], |
309
|
|
|
["x year(5)"], |
310
|
|
|
// Missing parentheses after keyword NOW |
311
|
|
|
["x timestamp default now"], |
312
|
|
|
["x timestamp on update now"], |
313
|
|
|
// "on update" with the current timestamp only available for datetime and timestamp |
314
|
|
|
["x date on update current_timestamp"], |
315
|
|
|
]; |
316
|
|
|
} |
317
|
|
|
|
318
|
|
|
/** |
319
|
|
|
* @param string $text |
320
|
|
|
* @dataProvider parseInvalidDefaultValuesProvider |
321
|
|
|
* @expectedException Exception |
322
|
|
|
*/ |
323
|
|
|
public function testParseInvalidDefaultValues($text) |
324
|
|
|
{ |
325
|
|
|
$stream = $this->makeStream($text); |
326
|
|
|
$column = new ColumnDefinition(); |
327
|
|
|
$column->parse($stream); |
328
|
|
|
} |
329
|
|
|
|
330
|
|
|
/** |
331
|
|
|
* @return array |
332
|
|
|
*/ |
333
|
|
|
public function parseInvalidDefaultValuesProvider() |
334
|
|
|
{ |
335
|
|
|
return [ |
336
|
|
|
["x timestamp default null"], |
337
|
|
|
["x date default current_timestamp"], |
338
|
|
|
["x int default "], |
339
|
|
|
["x year default 1900"], |
340
|
|
|
["x year default 2156"], |
341
|
|
|
["x enum('a', 'b', 'c') default 1"], |
342
|
|
|
["x enum('a', 'b', 'c') default 'd'"], |
343
|
|
|
["x set('a', 'b', 'c') default 1"], |
344
|
|
|
["x set('a', 'b', 'c') default 'd'"], |
345
|
|
|
["x text default 'abc'"], |
346
|
|
|
]; |
347
|
|
|
} |
348
|
|
|
|
349
|
|
|
/** |
350
|
|
|
* @dataProvider parseIndexesProvider |
351
|
|
|
* @param string $in |
352
|
|
|
* @param array $expectCount |
353
|
|
|
*/ |
354
|
|
|
public function testParseIndexes($in, array $expectCount) |
355
|
|
|
{ |
356
|
|
|
$stream = $this->makeStream($in); |
357
|
|
|
|
358
|
|
|
$column = new ColumnDefinition(); |
359
|
|
|
$column->parse($stream); |
360
|
|
|
|
361
|
|
|
$count = array_count_values(array_map(function ($e) { |
362
|
|
|
return $e->type; |
363
|
|
|
}, $column->indexes)); |
364
|
|
|
ksort($count); |
365
|
|
|
ksort($expectCount); |
366
|
|
|
|
367
|
|
|
$this->assertSame($expectCount, $count); |
368
|
|
|
} |
369
|
|
|
|
370
|
|
|
/** |
371
|
|
|
* @return array |
372
|
|
|
*/ |
373
|
|
|
public function parseIndexesProvider() |
374
|
|
|
{ |
375
|
|
|
return [ |
376
|
|
|
["x int", []], |
377
|
|
|
["x serial", ['UNIQUE KEY' => 1]], |
378
|
|
|
["x int serial default value", ['UNIQUE KEY' => 1]], |
379
|
|
|
["x int unique", ['UNIQUE KEY' => 1]], |
380
|
|
|
["x int unique key", ['UNIQUE KEY' => 1]], |
381
|
|
|
["x int primary key", ['PRIMARY KEY' => 1]], |
382
|
|
|
["x int key", ['PRIMARY KEY' => 1]], |
383
|
|
|
]; |
384
|
|
|
} |
385
|
|
|
|
386
|
|
|
/** |
387
|
|
|
* @param string $text |
388
|
|
|
* @param string|null $expected |
389
|
|
|
* @dataProvider getUninitialisedValuesProvider |
390
|
|
|
*/ |
391
|
|
|
public function testGetUninitialisedValues($text, $expected) |
392
|
|
|
{ |
393
|
|
|
$stream = $this->makeStream($text); |
394
|
|
|
$column = new ColumnDefinition(); |
395
|
|
|
$column->parse($stream); |
396
|
|
|
|
397
|
|
|
$this->assertSame($expected, $column->getUninitialisedValue()); |
398
|
|
|
} |
399
|
|
|
|
400
|
|
|
/** |
401
|
|
|
* @return array |
402
|
|
|
*/ |
403
|
|
|
public function getUninitialisedValuesProvider() |
404
|
|
|
{ |
405
|
|
|
return [ |
406
|
|
|
// [ Column definition, uninitialised value ] |
407
|
|
|
["x enum('a', 'b', 'c')", "a"], |
408
|
|
|
["x int", "0"], |
409
|
|
|
["x decimal", "0"], |
410
|
|
|
["x decimal(5,3)", "0.000"], |
411
|
|
|
["x char", ""], |
412
|
|
|
["x blob", null], |
413
|
|
|
]; |
414
|
|
|
} |
415
|
|
|
|
416
|
|
|
public function testApplyTableCollationSetsCollation() |
417
|
|
|
{ |
418
|
|
|
// Make sure the given collation is applied if none exists |
419
|
|
|
$column = new ColumnDefinition(); |
420
|
|
|
$utf8Collation = new CollationInfo("utf8"); |
421
|
|
|
$column->applyTableCollation($utf8Collation); |
422
|
|
|
|
423
|
|
|
$this->assertEquals($utf8Collation, $column->collation); |
424
|
|
|
|
425
|
|
|
// Make sure the given collation is NOT applied in one exists |
426
|
|
|
$latin1Collation = new CollationInfo("latin1"); |
427
|
|
|
$column->applyTableCollation($latin1Collation); |
428
|
|
|
$this->assertNotEquals($latin1Collation, $column->collation); |
429
|
|
|
} |
430
|
|
|
|
431
|
|
|
/** |
432
|
|
|
* @param string $text |
433
|
|
|
* @param string $expected |
434
|
|
|
* @dataProvider applyTableCollationEffectOnColumnTypeProvider |
435
|
|
|
*/ |
436
|
|
|
public function testApplyTableCollationEffectOnColumnType($text, $expected) |
437
|
|
|
{ |
438
|
|
|
$stream = $this->makeStream($text); |
439
|
|
|
$column = new ColumnDefinition(); |
440
|
|
|
$column->parse($stream); |
441
|
|
|
|
442
|
|
|
$collation = new CollationInfo("binary"); |
443
|
|
|
$column->applyTableCollation($collation); |
444
|
|
|
|
445
|
|
|
$this->assertSame($expected, $column->type); |
446
|
|
|
} |
447
|
|
|
|
448
|
|
|
/** |
449
|
|
|
* @return array |
450
|
|
|
*/ |
451
|
|
|
public function applyTableCollationEffectOnColumnTypeProvider() |
452
|
|
|
{ |
453
|
|
|
return [ |
454
|
|
|
// [ Column definition, expected column type ] |
455
|
|
|
// These are all types that will change |
456
|
|
|
["x char", "binary"], |
457
|
|
|
["x varchar(1)", "varbinary"], |
458
|
|
|
["x tinytext", "tinyblob"], |
459
|
|
|
["x text", "blob"], |
460
|
|
|
["x mediumtext", "mediumblob"], |
461
|
|
|
["x longtext", "longblob"], |
462
|
|
|
// An example of one that doesn't change |
463
|
|
|
["x int", "int"], |
464
|
|
|
]; |
465
|
|
|
} |
466
|
|
|
} |
467
|
|
|
|