Skip to content

Commit 1f7684a

Browse files
committed
Add basic support for JSON type (part of #2199)
1 parent 8d435db commit 1f7684a

File tree

11 files changed

+119
-20
lines changed

11 files changed

+119
-20
lines changed

Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql_com.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,11 @@ enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
348348
MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
349349
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
350350
MYSQL_TYPE_BIT,
351-
MYSQL_TYPE_NEWDECIMAL=246,
351+
MYSQL_TYPE_TIMESTAMP2,
352+
MYSQL_TYPE_DATETIME2,
353+
MYSQL_TYPE_TIME2,
354+
MYSQL_TYPE_JSON=245,
355+
MYSQL_TYPE_NEWDECIMAL=246,
352356
MYSQL_TYPE_ENUM=247,
353357
MYSQL_TYPE_SET=248,
354358
MYSQL_TYPE_TINY_BLOB=249,

Frameworks/SPMySQLFramework/SPMySQLDataTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,4 @@ extern NSString *SPMySQLMultiPointType;
7272
extern NSString *SPMySQLMultiLineStringType;
7373
extern NSString *SPMySQLMultiPolygonType;
7474
extern NSString *SPMySQLGeometryCollectionType;
75+
extern NSString *SPMySQLJsonType;

Frameworks/SPMySQLFramework/SPMySQLDataTypes.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,4 @@
7474
NSString *SPMySQLMultiLineStringType = @"MULTILINESTRING";
7575
NSString *SPMySQLMultiPolygonType = @"MULTIPOLYGON";
7676
NSString *SPMySQLGeometryCollectionType = @"GEOMETRYCOLLECTION";
77+
NSString *SPMySQLJsonType = @"JSON";

Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Data Conversion.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ + (void)_initializeDataConversion
7878
fieldProcessingMap[MYSQL_TYPE_NEWDATE] = SPMySQLResultFieldAsString;
7979
fieldProcessingMap[MYSQL_TYPE_VARCHAR] = SPMySQLResultFieldAsString;
8080
fieldProcessingMap[MYSQL_TYPE_BIT] = SPMySQLResultFieldAsBit;
81+
fieldProcessingMap[MYSQL_TYPE_JSON] = SPMySQLResultFieldAsString;
8182
fieldProcessingMap[MYSQL_TYPE_NEWDECIMAL] = SPMySQLResultFieldAsString;
8283
fieldProcessingMap[MYSQL_TYPE_ENUM] = SPMySQLResultFieldAsString;
8384
fieldProcessingMap[MYSQL_TYPE_SET] = SPMySQLResultFieldAsString;

Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Field Definitions.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ - (NSString *)_mysqlTypeToStringForType:(NSUInteger)type withCharsetNr:(NSUInteg
372372

373373
switch (type) {
374374

375-
case FIELD_TYPE_BIT:
375+
case MYSQL_TYPE_BIT:
376376
return @"BIT";
377377

378378
case MYSQL_TYPE_DECIMAL:
@@ -475,6 +475,9 @@ - (NSString *)_mysqlTypeToStringForType:(NSUInteger)type withCharsetNr:(NSUInteg
475475

476476
case MYSQL_TYPE_GEOMETRY:
477477
return @"GEOMETRY";
478+
479+
case MYSQL_TYPE_JSON:
480+
return @"JSON";
478481

479482
default:
480483
return @"UNKNOWN";

Resources/Plists/CompletionTokens.plist

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@
289289
<string>ISSUER</string>
290290
<string>ITERATE</string>
291291
<string>JOIN</string>
292+
<string>JSON</string>
292293
<string>KEY</string>
293294
<string>KEYS</string>
294295
<string>KEY_BLOCK_SIZE</string>
@@ -834,6 +835,27 @@
834835
<string>ISSIMPLE</string>
835836
<string>IS_FREE_LOCK</string>
836837
<string>IS_USED_LOCK</string>
838+
<string>JSON_APPEND</string>
839+
<string>JSON_ARRAY_APPEND</string>
840+
<string>JSON_ARRAY_INSERT</string>
841+
<string>JSON_ARRAY</string>
842+
<string>JSON_CONTAINS_PATH</string>
843+
<string>JSON_CONTAINS</string>
844+
<string>JSON_DEPTH</string>
845+
<string>JSON_EXTRACT</string>
846+
<string>JSON_INSERT</string>
847+
<string>JSON_KEYS</string>
848+
<string>JSON_LENGTH</string>
849+
<string>JSON_MERGE</string>
850+
<string>JSON_OBJECT</string>
851+
<string>JSON_QUOTE</string>
852+
<string>JSON_REMOVE</string>
853+
<string>JSON_REPLACE</string>
854+
<string>JSON_SEARCH</string>
855+
<string>JSON_SET</string>
856+
<string>JSON_TYPE</string>
857+
<string>JSON_UNQUOTE</string>
858+
<string>JSON_VALID</string>
837859
<string>LAST_DAY</string>
838860
<string>LAST_INSERT_ID</string>
839861
<string>LCASE</string>
@@ -1162,6 +1184,48 @@
11621184
<string>${1:bits}, ${2:str1}</string>
11631185
<key>FIND_IN_SET</key>
11641186
<string>${1:str}, ${2:strlist}</string>
1187+
<key>JSON_APPEND</key>
1188+
<string>${1:json_doc}, ${2:path}, ${3:val}${4:, ${5:path}, ${6:val}${7:, ${8:...}}}</string>
1189+
<key>JSON_ARRAY_APPEND</key>
1190+
<string>${1:json_doc}, ${2:path}, ${3:val}${4:, ${5:path}, ${6:val}${7:, ${8:...}}}</string>
1191+
<key>JSON_ARRAY_INSERT</key>
1192+
<string>${1:json_doc}, ${2:path}, ${3:val}${4:, ${5:path}, ${6:val}${7:, ${8:...}}}</string>
1193+
<key>JSON_ARRAY</key>
1194+
<string>${1:${2:val} ${3:, ${4:val}${5:, ${6:...}}}}</string>
1195+
<key>JSON_CONTAINS_PATH</key>
1196+
<string>${1:json_doc}, ${2:¦'one'¦'all'¦}, ${3:path}${4:, ${5:path}${6:, ${7:...}}}</string>
1197+
<key>JSON_CONTAINS</key>
1198+
<string>${1:json_doc}, ${2:val}${3:, ${4:path}}</string>
1199+
<key>JSON_DEPTH</key>
1200+
<string>${1:json_doc}</string>
1201+
<key>JSON_EXTRACT</key>
1202+
<string>${1:json_doc}, ${2:path}${3:, ${4:path}${5:, ${6:...}}}</string>
1203+
<key>JSON_INSERT</key>
1204+
<string>${1:json_doc}, ${2:path}, ${3:val}${4:, ${5:path}, ${6:val}${7:, ${8:...}}}</string>
1205+
<key>JSON_KEYS</key>
1206+
<string>${1:json_doc}${2:, ${3:path}}</string>
1207+
<key>JSON_LENGTH</key>
1208+
<string>${1:json_doc}${2:, ${3:path}}</string>
1209+
<key>JSON_MERGE</key>
1210+
<string>${1:json_doc}, ${2:json_doc}${3:, ${4:...}}</string>
1211+
<key>JSON_OBJECT</key>
1212+
<string>${1:${2:key}, ${3:val}${4:, ${5:key}, ${6:val}${7:, ${8:...}}}}</string>
1213+
<key>JSON_QUOTE</key>
1214+
<string>${1:json_val}</string>
1215+
<key>JSON_REMOVE</key>
1216+
<string>${1:json_doc}, ${2:path}${3:, ${4:path}${5:, ${6:...}}}</string>
1217+
<key>JSON_REPLACE</key>
1218+
<string>${1:json_doc}, ${2:path}, ${3:val}${4:, ${5:path}, ${6:val}${7:, ${8:...}}}</string>
1219+
<key>JSON_SEARCH</key>
1220+
<string>${1:json_doc}, ${2:¦'one'¦'all'¦}, ${3:search_str}${4:, ${5:escape_char}${6:, ${7:path${8:, ${9:...}}}}}</string>
1221+
<key>JSON_SET</key>
1222+
<string>${1:json_doc}, ${2:path}, ${3:val}${4:, ${5:path}, ${6:val}${7:, ${8:...}}}</string>
1223+
<key>JSON_TYPE</key>
1224+
<string>${1:json_val}</string>
1225+
<key>JSON_UNQUOTE</key>
1226+
<string>${1:val}</string>
1227+
<key>JSON_VALID</key>
1228+
<string>${1:val}</string>
11651229
</dict>
11661230
</dict>
11671231
</plist>

Source/SPEditorTokens.l

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ numeric ([+-]?(([0-9]+\.[0-9]+)|([0-9]*\.[0-9]+)|([0-9]+))(e[+-]?[0-9]+)?)
6161
ops "+"|"-"|"*"|"/"
6262
word [a-z_\.0-9\x80-\xEF@]
6363
variable @{1,2}[a-z_\.0-9\x80-\xEF$]+
64-
keyworda (G(R(OUP{s}BY|ANT(S)?)|E(NERAL|T_FORMAT|OMETRY(COLLECTION)?)|LOBAL)|B(Y(TE)?|TREE|I(GINT|N(LOG|ARY)|T)|O(TH|OL(EAN)?)|E(GIN|TWEEN|FORE)|LOB|ACKUP{s}TABLE)|H(IGH_PRIORITY|O(ST(S)?|UR(_(MI(NUTE|CROSECOND)|SECOND))?)|ELP|A(SH|NDLER|VING))|C(R(OSS|EATE)|H(ECK(SUM)?|A(R(SET|ACTER)?|NGE(D)?|IN))|IPHER|O(M(M(IT(TED)?|ENT)|P(RESSED|LETION|ACT))|N(S(TRAINT(_(SCHEMA|NAME|CATALOG))?|ISTENT)|NECTION|CURRENT|T(RIBUTORS|INUE|AINS)|DITION|VERT)|DE|L(UMN(S|_(NAME|FORMAT))?|LATE)|ALESCE{s}PARTITION)|U(R(RENT_(TIME(STAMP)?|DATE|USER)|SOR(_NAME)?)|BE)|L(IENT|OSE|ASS_ORIGIN)|A(S(CADE(D)?|E)|CHE{s}INDEX|TALOG_NAME|LL))|I(GNORE(_SERVER_IDS)?|MPORT{s}TABLESPACE|S(SUER|OLATION)?|N(S(TALL({s}PLUGIN)?|E(RT(_METHOD)?|NSITIVE))|N(O(BASE|DB)|ER)|T(1|2|8|3|O({s}(DUMP|OUT)FILE)?|4|E(RVAL|GER))?|ITIAL_SIZE|OUT|DEX(ES)?|VOKER|FILE)?|TERATE|O_THREAD|DENTIFIED|F)|D(ROP|YNAMIC|I(RECTORY|S(CARD{s}TABLESPACE|TINCT(ROW)?|K|ABLE{s}KEYS)|V)|O(UBLE)?|U(MPFILE|PLICATE|AL)|E(S(C(RIBE)?|_KEY_FILE)|C(IMAL|LARE)?|TERMINISTIC|F(INER|AULT)|L(ETE|AY(_KEY_WRITE|ED))|ALLOCATE)|A(Y(_(MI(NUTE|CROSECOND)|SECOND|HOUR))?|T(E(TIME)?|A(BASE(S)?|FILE)?)))|JOIN|E(RRORS|X(TEN(T_SIZE|DED)|I(STS|T)|P(LAIN|ANSION)|ECUTE)|SCAPE(D{s}BY)?|N(GINE(S)?|CLOSED{s}BY|D(S)?|UM|ABLE{s}KEYS)|VE(RY|NT)|LSE(IF)?|ACH)|K(ILL({s}(CONNECTION|QUERY))?|EY(S|_BLOCK_SIZE)?)|F(R(OM|AC_SECOND)|I(RST|XED|LE)|O(R(CE|EIGN)?|UND)|U(NCTION|LL(TEXT)?)|ETCH|L(OAT(8|4)?|USH)|A(ST|LSE))|A(G(GREGATE|AINST)|S(C(II)?|ENSITIVE)?|N(Y|D|ALYZE)|C(CESSIBLE|TION)|T|DD|UT(HORS|O(_INCREMENT|EXTEND_SIZE))|VG(_ROW_LENGTH)?|FTER|L(GORITHM|TER|L)))
64+
keyworda (G(R(OUP{s}BY|ANT(S)?)|E(NERAL|T_FORMAT|OMETRY(COLLECTION)?)|LOBAL)|B(Y(TE)?|TREE|I(GINT|N(LOG|ARY)|T)|O(TH|OL(EAN)?)|E(GIN|TWEEN|FORE)|LOB|ACKUP{s}TABLE)|H(IGH_PRIORITY|O(ST(S)?|UR(_(MI(NUTE|CROSECOND)|SECOND))?)|ELP|A(SH|NDLER|VING))|C(R(OSS|EATE)|H(ECK(SUM)?|A(R(SET|ACTER)?|NGE(D)?|IN))|IPHER|O(M(M(IT(TED)?|ENT)|P(RESSED|LETION|ACT))|N(S(TRAINT(_(SCHEMA|NAME|CATALOG))?|ISTENT)|NECTION|CURRENT|T(RIBUTORS|INUE|AINS)|DITION|VERT)|DE|L(UMN(S|_(NAME|FORMAT))?|LATE)|ALESCE{s}PARTITION)|U(R(RENT_(TIME(STAMP)?|DATE|USER)|SOR(_NAME)?)|BE)|L(IENT|OSE|ASS_ORIGIN)|A(S(CADE(D)?|E)|CHE{s}INDEX|TALOG_NAME|LL))|I(GNORE(_SERVER_IDS)?|MPORT{s}TABLESPACE|S(SUER|OLATION)?|N(S(TALL({s}PLUGIN)?|E(RT(_METHOD)?|NSITIVE))|N(O(BASE|DB)|ER)|T(1|2|8|3|O({s}(DUMP|OUT)FILE)?|4|E(RVAL|GER))?|ITIAL_SIZE|OUT|DEX(ES)?|VOKER|FILE)?|TERATE|O_THREAD|DENTIFIED|F)|D(ROP|YNAMIC|I(RECTORY|S(CARD{s}TABLESPACE|TINCT(ROW)?|K|ABLE{s}KEYS)|V)|O(UBLE)?|U(MPFILE|PLICATE|AL)|E(S(C(RIBE)?|_KEY_FILE)|C(IMAL|LARE)?|TERMINISTIC|F(INER|AULT)|L(ETE|AY(_KEY_WRITE|ED))|ALLOCATE)|A(Y(_(MI(NUTE|CROSECOND)|SECOND|HOUR))?|T(E(TIME)?|A(BASE(S)?|FILE)?)))|J(OI|SO)N|E(RRORS|X(TEN(T_SIZE|DED)|I(STS|T)|P(LAIN|ANSION)|ECUTE)|SCAPE(D{s}BY)?|N(GINE(S)?|CLOSED{s}BY|D(S)?|UM|ABLE{s}KEYS)|VE(RY|NT)|LSE(IF)?|ACH)|K(ILL({s}(CONNECTION|QUERY))?|EY(S|_BLOCK_SIZE)?)|F(R(OM|AC_SECOND)|I(RST|XED|LE)|O(R(CE|EIGN)?|UND)|U(NCTION|LL(TEXT)?)|ETCH|L(OAT(8|4)?|USH)|A(ST|LSE))|A(G(GREGATE|AINST)|S(C(II)?|ENSITIVE)?|N(Y|D|ALYZE)|C(CESSIBLE|TION)|T|DD|UT(HORS|O(_INCREMENT|EXTEND_SIZE))|VG(_ROW_LENGTH)?|FTER|L(GORITHM|TER|L)))
6565
keywordl (R(TREE|IGHT|O(UTINE|W(S|_FORMAT)?|LL(BACK|UP))|E(GEXP|MOVE{s}PARTITIONING|BUILD{s}PARTITION|S(T(RICT|ORE{s}TABLE)|IGNAL|UME|ET)|NAME|COVER|TURN(S)?|ORGANIZE{s}PARTITION|D(O(_BUFFER_SIZE|FILE)|UNDANT)|P(EAT(ABLE)?|L(ICATION|ACE)|AIR)|VOKE|QUIRE|FERENCES|L(OAD|EASE|AY_(THREAD|LOG_(POS|FILE)))|A(D(S|_(ONLY|WRITE))?|L))|LIKE|ANGE)|M(YSQL_ERRNO|I(GRATE|N(_ROWS|UTE(_(MICROSECOND|SECOND))?)|CROSECOND|DDLEINT)|O(NTH|D(IF(Y|IES)|E)?)|U(TEX|LTI(PO(INT|LYGON)|LINESTRING))|E(RGE|MORY|SSAGE_TEXT|DIUM(BLOB|TEXT|INT)?)|A(X(_(ROWS|SIZE|CONNECTIONS_PER_HOUR|U(SER_CONNECTIONS|PDATES_PER_HOUR)|QUERIES_PER_HOUR)|VALUE)|STER(_(S(SL(_(C(IPHER|ERT|A(PATH)?)|VERIFY_SERVER_CERT|KEY))?|ERVER_ID)|H(OST|EARTBEAT_PERIOD)|CONNECT_RETRY|USER|P(ORT|ASSWORD)|LOG_(POS|FILE)))?|TCH))|N(CHAR|O(NE|_W(RITE_TO_BINLOG|AIT)|T|DEGROUP)?|DB(CLUSTER)?|U(MERIC|LL)|E(XT|W)|VARCHAR|A(ME(S)?|T(IONAL|URAL)))|O(R(DER{s}BY)?|N(({s}DUPLICATE{s}KEY{s}UPDATE)?|E(_SHOT)?|LINE)?|UT(ER|FILE)?|P(TI(MIZE|ON(S|ALLY)?)|EN)|FF(SET|LINE)|WNER|LD_PASSWORD)|P(R(I(MARY|VILEGES)|OCE(SS|DURE{s}(ANALYSE)?)|E(SERVE|CISION|PARE|V))|HASE|O(RT|INT|LYGON)|URGE|A(R(SER|TI(TION(S|ING)?|AL))|SSWORD|CK_KEYS))|QU(ICK|ERY|ARTER)|L(I(MIT|ST|NE(S(TRING)?|AR)|KE)|O(G(S|FILE({s}GROUP))|NG(BLOB|TEXT)?|C(K(S)?|AL(TIME(STAMP)?)?)|OP|W_PRIORITY|AD{s}(DATA|INDEX{s}INTO{s}CACHE|XML))|E(SS|VEL|FT|A(DING|VE(S)?))|A(ST|NGUAGE)))
6666
keywords (X(OR|509|A)|S(MALLINT|SL|H(OW({s}(E(NGINE(S)?|RRORS)|M(ASTER|UTEX)|BINLOG|GRANTS|INNODB|P(RIVILEGES|ROFILE(S)?|ROCEDURE{s}CODE)|SLAVE{s}(HOSTS|STATUS)|TRIGGERS|VARIABLES|WARNINGS|(FULL{s})?PROCESSLIST|FIELDS|PLUGIN(S)?|STORAGE{s}ENGINES|TABLE{s}TYPES|CO(LUMNS|LLATION)|BINLOG{s}EVENTS))?|UTDOWN|ARE)|NAPSHOT|CHE(MA(S|_NAME)?|DULE(R)?)|T(R(ING|AIGHT_JOIN)|O(RAGE|P)|A(RT(S|ING{s}BY)?|TUS))|I(GN(ED|AL)|MPLE)|O(ME|NAME|CKET|UNDS)|U(B(CLASS_ORIGIN|JECT|PARTITION(S)?)|SPEND|PER)|P(ECIFIC|ATIAL)|E(R(IAL(IZABLE)?|VER)|SSION|NSITIVE|C(OND(_MICROSECOND)?|URITY)|T({s}(PASSWORD|NAMES|ONE_SHOT))?|PARATOR|LECT)|QL(STATE|_(MAX_JOIN_SIZE|B(IG_(RESULT|SELECTS|TABLES)|UFFER_RESULT)|S(MALL_RESULT|ELECT_LIMIT|LAVE_SKIP_COUNTER|AFE_UPDATES)|NO_CACHE|CA(CHE|LC_FOUND_ROWS)|T(SI_(M(INUTE|ONTH)|SECOND|HOUR|YEAR|DAY|QUARTER|FRAC_SECOND|WEEK)|HREAD)|QUOTE_SHOW_CREATE|WARNINGS|LO(G_(BIN|OFF|UPDATE)|W_PRIORITY_UPDATES)|AUTO_IS_NULL)|EXCEPTION|WARNING)?|L(OW|AVE)|AVEPOINT)|YEAR(_MONTH)?|T(R(IGGER(S)?|U(NCATE|E)|A(NSACTION|ILING))|H(EN|AN)|YPE|I(ME(STAMP(DIFF|ADD)?)?|NY(BLOB|TEXT|INT))|O|E(RMINATED{s}BY|XT|MP(TABLE|ORARY))|ABLE(S(PACE)?|_NAME)?)|ZEROFILL|U(S(ING|E(R(_RESOURCES)?|_FRM)?|AGE)|N(SIGNED|COMMITTED|TIL|I(NSTALL({s}PLUGIN)?|CODE|ON|QUE)|D(O(_BUFFER_SIZE|FILE)?|EFINED)|KNOWN|LOCK)|TC_(TIME(STAMP)?|DATE)|P(GRADE|DATE))|V(IEW|A(R(BINARY|YING|CHAR(ACTER)?|IABLES)|LUE(S)?))|W(R(ITE|APPER)|H(ILE|E(RE|N))|ITH({s}PARSER)?|ORK|EEK|A(RNINGS|IT)))
6767

@@ -348,6 +348,7 @@ ISOLATION
348348
ISSUER
349349
ITERATE
350350
JOIN
351+
JSON
351352
KEY
352353
KEYS
353354
KEY_BLOCK_SIZE

Source/SPTableData.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1267,7 +1267,8 @@ - (NSDictionary *) parseFieldDefinitionStringParts:(NSArray *)definitionParts
12671267
} else if ([detailString isEqualToString:@"ENUM"] || [detailString isEqualToString:@"SET"]) {
12681268
[fieldDetails setObject:@"enum" forKey:@"typegrouping"];
12691269
} else if ([detailString isEqualToString:@"TINYTEXT"] || [detailString isEqualToString:@"TEXT"]
1270-
|| [detailString isEqualToString:@"MEDIUMTEXT"] || [detailString isEqualToString:@"LONGTEXT"]) {
1270+
|| [detailString isEqualToString:@"MEDIUMTEXT"] || [detailString isEqualToString:@"LONGTEXT"]
1271+
|| [detailString isEqualToString:@"JSON"]) { // JSON is seen as a text type by us, but works a bit different (e.g. encoding is always "utf8mb4")
12711272
[fieldDetails setObject:@"textdata" forKey:@"typegrouping"];
12721273
} else if ([detailString isEqualToString:@"POINT"] || [detailString isEqualToString:@"GEOMETRY"]
12731274
|| [detailString isEqualToString:@"LINESTRING"] || [detailString isEqualToString:@"POLYGON"]

Source/SPTableStructure.m

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ - (void)awakeFromNib
194194
SPMySQLLongBlobType,
195195
SPMySQLBinaryType,
196196
SPMySQLVarBinaryType,
197+
SPMySQLJsonType,
197198
SPMySQLEnumType,
198199
SPMySQLSetType,
199200
@"--------",
@@ -959,7 +960,10 @@ - (NSString *)_buildPartialColumnDefinitionString:(NSDictionary *)theRow
959960
if(!specialFieldTypes) {
960961

961962

962-
if ([fieldValidation isFieldTypeString:theRowType]) {
963+
if ([theRowType isEqualToString:@"JSON"]) {
964+
// we "see" JSON as a string, but it is not internally to MySQL and so doesn't allow CHARACTER SET/BINARY/COLLATE either.
965+
}
966+
else if ([fieldValidation isFieldTypeString:theRowType]) {
963967
BOOL charsetSupport = [[tableDocumentInstance serverSupport] supportsPost41CharacterSetHandling];
964968

965969
// Add CHARSET
@@ -1002,16 +1006,17 @@ - (NSString *)_buildPartialColumnDefinitionString:(NSDictionary *)theRow
10021006
// Don't provide any defaults for auto-increment fields
10031007
if (![theRowExtra isEqualToString:@"AUTO_INCREMENT"]) {
10041008
NSArray *matches;
1009+
NSString *defaultValue = [theRow objectForKey:@"default"];
10051010
// If a NULL value has been specified, and NULL is allowed, specify DEFAULT NULL
1006-
if ([[theRow objectForKey:@"default"] isEqualToString:[prefs objectForKey:SPNullValue]])
1011+
if ([defaultValue isEqualToString:[prefs objectForKey:SPNullValue]])
10071012
{
10081013
if ([[theRow objectForKey:@"null"] integerValue] == 1) {
10091014
[queryString appendString:@"\n DEFAULT NULL"];
10101015
}
10111016
}
10121017
// Otherwise, if CURRENT_TIMESTAMP was specified for timestamps/datetimes, use that
10131018
else if ([theRowType isInArray:@[@"TIMESTAMP",@"DATETIME"]] &&
1014-
[(matches = [[[theRow objectForKey:@"default"] uppercaseString] captureComponentsMatchedByRegex:SPCurrentTimestampPattern]) count])
1019+
[(matches = [[defaultValue uppercaseString] captureComponentsMatchedByRegex:SPCurrentTimestampPattern]) count])
10151020
{
10161021
[queryString appendString:@"\n DEFAULT CURRENT_TIMESTAMP"];
10171022
NSString *userLen = [matches objectAtIndex:1];
@@ -1023,17 +1028,17 @@ - (NSString *)_buildPartialColumnDefinitionString:(NSDictionary *)theRow
10231028
}
10241029
// If the field is of type BIT, permit the use of single qoutes and also don't quote the default value.
10251030
// For example, use DEFAULT b'1' as opposed to DEFAULT 'b\'1\'' which results in an error.
1026-
else if ([(NSString *)[theRow objectForKey:@"default"] length] && [theRowType isEqualToString:@"BIT"]) {
1027-
[queryString appendFormat:@"\n DEFAULT %@", [theRow objectForKey:@"default"]];
1031+
else if ([defaultValue length] && [theRowType isEqualToString:@"BIT"]) {
1032+
[queryString appendFormat:@"\n DEFAULT %@", defaultValue];
10281033
}
10291034
// Suppress appending DEFAULT clause for any numerics, date, time fields if default is empty to avoid error messages;
1030-
// also don't specify a default for TEXT/BLOB or geometry fields to avoid strict mode errors
1031-
else if (![(NSString *)[theRow objectForKey:@"default"] length] && ([fieldValidation isFieldTypeNumeric:theRowType] || [fieldValidation isFieldTypeDate:theRowType] || [theRowType hasSuffix:@"TEXT"] || [theRowType hasSuffix:@"BLOB"] || [fieldValidation isFieldTypeGeometry:theRowType])) {
1035+
// also don't specify a default for TEXT/BLOB, JSON or geometry fields to avoid strict mode errors
1036+
else if (![defaultValue length] && ([fieldValidation isFieldTypeNumeric:theRowType] || [fieldValidation isFieldTypeDate:theRowType] || [theRowType hasSuffix:@"TEXT"] || [theRowType hasSuffix:@"BLOB"] || [theRowType isEqualToString:@"JSON"] || [fieldValidation isFieldTypeGeometry:theRowType])) {
10321037
;
10331038
}
10341039
// Otherwise, use the provided default
10351040
else {
1036-
[queryString appendFormat:@"\n DEFAULT %@", [mySQLConnection escapeAndQuoteString:[theRow objectForKey:@"default"]]];
1041+
[queryString appendFormat:@"\n DEFAULT %@", [mySQLConnection escapeAndQuoteString:defaultValue]];
10371042
}
10381043
}
10391044

@@ -1717,6 +1722,12 @@ + (SPFieldTypeHelp *)helpForFieldType:(NSString *)typeName
17171722
[NSString stringWithFormat:NSLocalizedString(@"M: %@ to %@ bytes", @"range for varbinary type"),FN(@0),FN(@(65535))],
17181723
NSLocalizedString(@"A byte array with variable length. The actual number of bytes is further limited by the values of other fields in the row.",@"description of varbinary")
17191724
),
1725+
MakeFieldTypeHelp(
1726+
SPMySQLJsonType,
1727+
@"JSON",
1728+
NSLocalizedString(@"Limited to @@max_allowed_packet", @"range for json type"),
1729+
NSLocalizedString(@"A data type that validates JSON data on INSERT and internally stores it in a binary format that is both, more compact and faster to access than textual JSON.\nAvailable from MySQL 5.7.8.", @"description of json")
1730+
),
17201731
MakeFieldTypeHelp(
17211732
SPMySQLEnumType,
17221733
@"ENUM('member',...)",

0 commit comments

Comments
 (0)