From 69e7b46829148311036b89a19250abe1fa70fd5d Mon Sep 17 00:00:00 2001 From: Shigeki Morimoto Date: Thu, 28 Sep 2017 16:59:22 +0900 Subject: [PATCH 1/8] Allow UNIQUE(a) without space. --- grammar/13-01-14-create-table.pegjs | 7 +++++-- lib/sqljs-parser.js | 6 +++++- tests/parser/13-01-14-create-table.js | 22 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/grammar/13-01-14-create-table.pegjs b/grammar/13-01-14-create-table.pegjs index 97aeb2b..0670e30 100644 --- a/grammar/13-01-14-create-table.pegjs +++ b/grammar/13-01-14-create-table.pegjs @@ -94,9 +94,13 @@ CREATE_DEFINITION_CONSTRAINT references: ref }; } - / "UNIQUE"i __ type:("KEY"i/"INDEX"i)? + / "UNIQUE"i _ type:("KEY"i/"INDEX"i)? name:(__ name:(ID/STRING) {return name;})? _ "(" _ idlist:ID_LIST ")" _ { + if(!key && name) { + key = name + name = undefined + } var key = { type: "CONSTRAINT", constraint: (type ? type.toUpperCase() : 'INDEX'), @@ -303,4 +307,3 @@ COLUMN_TYPE_PROPERTIES "Column type properties" return props; } / _ { return {}; } - diff --git a/lib/sqljs-parser.js b/lib/sqljs-parser.js index ab2aa23..dc9308b 100644 --- a/lib/sqljs-parser.js +++ b/lib/sqljs-parser.js @@ -7966,7 +7966,7 @@ module.exports = (function(){ } } if (result0 !== null) { - result1 = parse___(); + result1 = parse__(); if (result1 !== null) { if (input.substr(pos, 3).toLowerCase() === "key") { result2 = input.substr(pos, 3); @@ -8087,6 +8087,10 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, type, name, idlist) { + if(!key && name) { + key = name + name = undefined + } var key = { type: "CONSTRAINT", constraint: (type ? type.toUpperCase() : 'INDEX'), diff --git a/tests/parser/13-01-14-create-table.js b/tests/parser/13-01-14-create-table.js index 96a996d..94d8b75 100644 --- a/tests/parser/13-01-14-create-table.js +++ b/tests/parser/13-01-14-create-table.js @@ -226,6 +226,28 @@ exports['Grammar: CREATE TABLE: valid input'] = rule_yields.bind(null, ], [ 'CREATE TABLE "a b c" ("x y z" integer)', result9 + ], [ + 'CREATE TABLE a (id integer, UNIQUE(id))', + [{ + statement: 'CREATE', + what: 'TABLE', + schema: undefined, + table: 'a', + definitions: [ { type: 'INT', name: 'id' }, + { type: 'CONSTRAINT', constraint: 'INDEX', unique: true, columns: [ 'id' ] }, + ] + }] + ], [ + 'CREATE TABLE a (id integer, UNIQUE INDEX(id))', + [{ + statement: 'CREATE', + what: 'TABLE', + schema: undefined, + table: 'a', + definitions: [ { type: 'INT', name: 'id' }, + { type: 'CONSTRAINT', constraint: 'INDEX', unique: true, columns: [ 'id' ] }, + ] + }] ] ], 'deepEqual' ); From c84d763f14cf9e3981105630f303f081f5cac9eb Mon Sep 17 00:00:00 2001 From: Shigeki Morimoto Date: Thu, 28 Sep 2017 17:50:33 +0900 Subject: [PATCH 2/8] Allow INDEX(col(10)). --- grammar/13-01-14-create-table.pegjs | 17 ++- lib/sqljs-parser.js | 184 +++++++++++++++++++++++++- tests/parser/13-01-14-create-table.js | 15 ++- 3 files changed, 210 insertions(+), 6 deletions(-) diff --git a/grammar/13-01-14-create-table.pegjs b/grammar/13-01-14-create-table.pegjs index 0670e30..89fa406 100644 --- a/grammar/13-01-14-create-table.pegjs +++ b/grammar/13-01-14-create-table.pegjs @@ -95,7 +95,7 @@ CREATE_DEFINITION_CONSTRAINT }; } / "UNIQUE"i _ type:("KEY"i/"INDEX"i)? - name:(__ name:(ID/STRING) {return name;})? _ "(" _ idlist:ID_LIST ")" _ + name:(__ name:(ID/STRING) {return name;})? _ "(" _ idlist:INDEX_COL_NAME_LIST ")" _ { if(!key && name) { key = name @@ -112,7 +112,7 @@ CREATE_DEFINITION_CONSTRAINT return key; } / unique:("UNIQUE"i __)? type:("KEY"i/"INDEX"i) - name:(__ name:(ID/STRING) {return name;})? _ "(" _ idlist:ID_LIST ")" _ + name:(__ name:(ID/STRING) {return name;})? _ "(" _ idlist:INDEX_COL_NAME_LIST ")" _ { var key = { type: "CONSTRAINT", @@ -152,6 +152,19 @@ ID_LIST STRING_ID_LIST = id:(STRING/ID) _ rest:(',' _ id2:(STRING/ID) _ { return id2; })* { rest.unshift(id); return rest; } +INDEX_COL_NAME_LIST + = index_col_name:INDEX_COL_NAME _ rest:(',' _ index_col_name2:INDEX_COL_NAME _ { return index_col_name2; })* { rest.unshift(index_col_name); return rest; } + +INDEX_COL_NAME + = id:ID length:TYPE_LENGTH { + var key = { + id: id, + } + if(length) + key.length = length + return key + } + NUMERIC_TYPE_LENGTH = _ "(" _ length:POSITIVE_INTEGER _ "," _ decimals:POSITIVE_INTEGER _ ")" { diff --git a/lib/sqljs-parser.js b/lib/sqljs-parser.js index dc9308b..6365ed8 100644 --- a/lib/sqljs-parser.js +++ b/lib/sqljs-parser.js @@ -100,6 +100,8 @@ module.exports = (function(){ "CONSTRAINT_NAME_OPT": parse_CONSTRAINT_NAME_OPT, "ID_LIST": parse_ID_LIST, "STRING_ID_LIST": parse_STRING_ID_LIST, + "INDEX_COL_NAME_LIST": parse_INDEX_COL_NAME_LIST, + "INDEX_COL_NAME": parse_INDEX_COL_NAME, "NUMERIC_TYPE_LENGTH": parse_NUMERIC_TYPE_LENGTH, "TYPE_LENGTH": parse_TYPE_LENGTH, "COLUMN_TYPE_PROPERTIES": parse_COLUMN_TYPE_PROPERTIES, @@ -8030,7 +8032,7 @@ module.exports = (function(){ if (result5 !== null) { result6 = parse__(); if (result6 !== null) { - result7 = parse_ID_LIST(); + result7 = parse_INDEX_COL_NAME_LIST(); if (result7 !== null) { if (input.charCodeAt(pos) === 41) { result8 = ")"; @@ -8193,7 +8195,7 @@ module.exports = (function(){ if (result4 !== null) { result5 = parse__(); if (result5 !== null) { - result6 = parse_ID_LIST(); + result6 = parse_INDEX_COL_NAME_LIST(); if (result6 !== null) { if (input.charCodeAt(pos) === 41) { result7 = ")"; @@ -8714,6 +8716,184 @@ module.exports = (function(){ return result0; } + function parse_INDEX_COL_NAME_LIST() { + var cacheKey = "INDEX_COL_NAME_LIST@" + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + var result0, result1, result2, result3, result4, result5, result6; + var pos0, pos1, pos2, pos3; + + pos0 = pos; + pos1 = pos; + result0 = parse_INDEX_COL_NAME(); + if (result0 !== null) { + result1 = parse__(); + if (result1 !== null) { + result2 = []; + pos2 = pos; + pos3 = pos; + if (input.charCodeAt(pos) === 44) { + result3 = ","; + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\",\""); + } + } + if (result3 !== null) { + result4 = parse__(); + if (result4 !== null) { + result5 = parse_INDEX_COL_NAME(); + if (result5 !== null) { + result6 = parse__(); + if (result6 !== null) { + result3 = [result3, result4, result5, result6]; + } else { + result3 = null; + pos = pos3; + } + } else { + result3 = null; + pos = pos3; + } + } else { + result3 = null; + pos = pos3; + } + } else { + result3 = null; + pos = pos3; + } + if (result3 !== null) { + result3 = (function(offset, index_col_name2) { return index_col_name2; })(pos2, result3[2]); + } + if (result3 === null) { + pos = pos2; + } + while (result3 !== null) { + result2.push(result3); + pos2 = pos; + pos3 = pos; + if (input.charCodeAt(pos) === 44) { + result3 = ","; + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\",\""); + } + } + if (result3 !== null) { + result4 = parse__(); + if (result4 !== null) { + result5 = parse_INDEX_COL_NAME(); + if (result5 !== null) { + result6 = parse__(); + if (result6 !== null) { + result3 = [result3, result4, result5, result6]; + } else { + result3 = null; + pos = pos3; + } + } else { + result3 = null; + pos = pos3; + } + } else { + result3 = null; + pos = pos3; + } + } else { + result3 = null; + pos = pos3; + } + if (result3 !== null) { + result3 = (function(offset, index_col_name2) { return index_col_name2; })(pos2, result3[2]); + } + if (result3 === null) { + pos = pos2; + } + } + if (result2 !== null) { + result0 = [result0, result1, result2]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = (function(offset, index_col_name, rest) { rest.unshift(index_col_name); return rest; })(pos0, result0[0], result0[2]); + } + if (result0 === null) { + pos = pos0; + } + + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_INDEX_COL_NAME() { + var cacheKey = "INDEX_COL_NAME@" + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + var result0, result1; + var pos0, pos1; + + pos0 = pos; + pos1 = pos; + result0 = parse_ID(); + if (result0 !== null) { + result1 = parse_TYPE_LENGTH(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = (function(offset, id, length) { + var key = { + id: id, + } + if(length) + key.length = length + return key + })(pos0, result0[0], result0[1]); + } + if (result0 === null) { + pos = pos0; + } + + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + function parse_NUMERIC_TYPE_LENGTH() { var cacheKey = "NUMERIC_TYPE_LENGTH@" + pos; var cachedResult = cache[cacheKey]; diff --git a/tests/parser/13-01-14-create-table.js b/tests/parser/13-01-14-create-table.js index 94d8b75..c6adb5f 100644 --- a/tests/parser/13-01-14-create-table.js +++ b/tests/parser/13-01-14-create-table.js @@ -234,7 +234,7 @@ exports['Grammar: CREATE TABLE: valid input'] = rule_yields.bind(null, schema: undefined, table: 'a', definitions: [ { type: 'INT', name: 'id' }, - { type: 'CONSTRAINT', constraint: 'INDEX', unique: true, columns: [ 'id' ] }, + { type: 'CONSTRAINT', constraint: 'INDEX', unique: true, columns: [ {id: 'id'} ] }, ] }] ], [ @@ -245,7 +245,18 @@ exports['Grammar: CREATE TABLE: valid input'] = rule_yields.bind(null, schema: undefined, table: 'a', definitions: [ { type: 'INT', name: 'id' }, - { type: 'CONSTRAINT', constraint: 'INDEX', unique: true, columns: [ 'id' ] }, + { type: 'CONSTRAINT', constraint: 'INDEX', unique: true, columns: [ {id: 'id'} ] }, + ] + }] + ], [ + 'CREATE TABLE a (name varchar(255), UNIQUE INDEX(name(10)))', + [{ + statement: 'CREATE', + what: 'TABLE', + schema: undefined, + table: 'a', + definitions: [ { type: 'VARCHAR', name: 'name', length: 255 }, + { type: 'CONSTRAINT', constraint: 'INDEX', unique: true, columns: [ {id: 'name', length: 10, } ] }, ] }] ] From 0f9a3354b8ec25ac9b00880ae4345571e2da020a Mon Sep 17 00:00:00 2001 From: Shigeki Morimoto Date: Thu, 28 Sep 2017 17:54:25 +0900 Subject: [PATCH 3/8] Allow SET. --- grammar/13-01-14-create-table.pegjs | 7 + lib/sqljs-parser.js | 649 +++++++++++++++----------- tests/parser/13-01-14-create-table.js | 10 + 3 files changed, 386 insertions(+), 280 deletions(-) diff --git a/grammar/13-01-14-create-table.pegjs b/grammar/13-01-14-create-table.pegjs index 89fa406..06bd4ea 100644 --- a/grammar/13-01-14-create-table.pegjs +++ b/grammar/13-01-14-create-table.pegjs @@ -265,6 +265,13 @@ COLUMN_TYPE_PROPERTIES "Column type properties" props.values = values; return props; } + / _ "SET"i _ "(" values:STRING_ID_LIST ")" _ props:COLUMN_TYPE_PROPERTIES { + if(props.type) + throw new SyntaxError("Ambiguous type"); + props.type = 'SET'; + props.values = values; + return props; + } / _ "UNSIGNED"i _ props:COLUMN_TYPE_PROPERTIES { props.unsigned=true; return props; diff --git a/lib/sqljs-parser.js b/lib/sqljs-parser.js index 6365ed8..50c506b 100644 --- a/lib/sqljs-parser.js +++ b/lib/sqljs-parser.js @@ -10170,21 +10170,61 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 8).toLowerCase() === "unsigned") { - result1 = input.substr(pos, 8); - pos += 8; + if (input.substr(pos, 3).toLowerCase() === "set") { + result1 = input.substr(pos, 3); + pos += 3; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"UNSIGNED\""); + matchFailed("\"SET\""); } } if (result1 !== null) { result2 = parse__(); if (result2 !== null) { - result3 = parse_COLUMN_TYPE_PROPERTIES(); + if (input.charCodeAt(pos) === 40) { + result3 = "("; + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"(\""); + } + } if (result3 !== null) { - result0 = [result0, result1, result2, result3]; + result4 = parse_STRING_ID_LIST(); + if (result4 !== null) { + if (input.charCodeAt(pos) === 41) { + result5 = ")"; + pos++; + } else { + result5 = null; + if (reportFailures === 0) { + matchFailed("\")\""); + } + } + if (result5 !== null) { + result6 = parse__(); + if (result6 !== null) { + result7 = parse_COLUMN_TYPE_PROPERTIES(); + if (result7 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10202,10 +10242,13 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, props) { - props.unsigned=true; - return props; - })(pos0, result0[3]); + result0 = (function(offset, values, props) { + if(props.type) + throw new SyntaxError("Ambiguous type"); + props.type = 'SET'; + props.values = values; + return props; + })(pos0, result0[4], result0[7]); } if (result0 === null) { pos = pos0; @@ -10215,13 +10258,13 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 6).toLowerCase() === "signed") { - result1 = input.substr(pos, 6); - pos += 6; + if (input.substr(pos, 8).toLowerCase() === "unsigned") { + result1 = input.substr(pos, 8); + pos += 8; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"SIGNED\""); + matchFailed("\"UNSIGNED\""); } } if (result1 !== null) { @@ -10248,7 +10291,7 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.signed=true; + props.unsigned=true; return props; })(pos0, result0[3]); } @@ -10260,41 +10303,21 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 3).toLowerCase() === "not") { - result1 = input.substr(pos, 3); - pos += 3; + if (input.substr(pos, 6).toLowerCase() === "signed") { + result1 = input.substr(pos, 6); + pos += 6; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"NOT\""); + matchFailed("\"SIGNED\""); } } if (result1 !== null) { result2 = parse__(); if (result2 !== null) { - if (input.substr(pos, 4).toLowerCase() === "null") { - result3 = input.substr(pos, 4); - pos += 4; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"NULL\""); - } - } + result3 = parse_COLUMN_TYPE_PROPERTIES(); if (result3 !== null) { - result4 = parse__(); - if (result4 !== null) { - result5 = parse_COLUMN_TYPE_PROPERTIES(); - if (result5 !== null) { - result0 = [result0, result1, result2, result3, result4, result5]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3]; } else { result0 = null; pos = pos1; @@ -10313,11 +10336,9 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - if(typeof props.notNull !== 'undefined') - throw new Error('NULL or NOT NULL?'); - props.notNull=true; - return props; - })(pos0, result0[5]); + props.signed=true; + return props; + })(pos0, result0[3]); } if (result0 === null) { pos = pos0; @@ -10327,19 +10348,45 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "null") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 3).toLowerCase() === "not") { + result1 = input.substr(pos, 3); + pos += 3; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"NULL\""); + matchFailed("\"NOT\""); } } if (result1 !== null) { - result2 = parse_COLUMN_TYPE_PROPERTIES(); + result2 = parse__(); if (result2 !== null) { - result0 = [result0, result1, result2]; + if (input.substr(pos, 4).toLowerCase() === "null") { + result3 = input.substr(pos, 4); + pos += 4; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"NULL\""); + } + } + if (result3 !== null) { + result4 = parse__(); + if (result4 !== null) { + result5 = parse_COLUMN_TYPE_PROPERTIES(); + if (result5 !== null) { + result0 = [result0, result1, result2, result3, result4, result5]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10356,9 +10403,9 @@ module.exports = (function(){ result0 = (function(offset, props) { if(typeof props.notNull !== 'undefined') throw new Error('NULL or NOT NULL?'); - props.notNull=false; + props.notNull=true; return props; - })(pos0, result0[2]); + })(pos0, result0[5]); } if (result0 === null) { pos = pos0; @@ -10368,53 +10415,19 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "primary") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 4).toLowerCase() === "null") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"PRIMARY\""); + matchFailed("\"NULL\""); } } if (result1 !== null) { - pos2 = pos; - result2 = parse__(); + result2 = parse_COLUMN_TYPE_PROPERTIES(); if (result2 !== null) { - if (input.substr(pos, 3).toLowerCase() === "key") { - result3 = input.substr(pos, 3); - pos += 3; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"KEY\""); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result3 = parse__(); - if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2]; } else { result0 = null; pos = pos1; @@ -10429,9 +10442,11 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.primaryKey=true; + if(typeof props.notNull !== 'undefined') + throw new Error('NULL or NOT NULL?'); + props.notNull=false; return props; - })(pos0, result0[4]); + })(pos0, result0[2]); } if (result0 === null) { pos = pos0; @@ -10441,24 +10456,37 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "uniq") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 7).toLowerCase() === "primary") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"UNIQ\""); + matchFailed("\"PRIMARY\""); } } if (result1 !== null) { - if (input.substr(pos, 2).toLowerCase() === "ue") { - result2 = input.substr(pos, 2); - pos += 2; + pos2 = pos; + result2 = parse__(); + if (result2 !== null) { + if (input.substr(pos, 3).toLowerCase() === "key") { + result3 = input.substr(pos, 3); + pos += 3; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"KEY\""); + } + } + if (result3 !== null) { + result2 = [result2, result3]; + } else { + result2 = null; + pos = pos2; + } } else { result2 = null; - if (reportFailures === 0) { - matchFailed("\"UE\""); - } + pos = pos2; } result2 = result2 !== null ? result2 : ""; if (result2 !== null) { @@ -10489,7 +10517,7 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.unique=true; + props.primaryKey=true; return props; })(pos0, result0[4]); } @@ -10501,63 +10529,32 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "auto") { + if (input.substr(pos, 4).toLowerCase() === "uniq") { result1 = input.substr(pos, 4); pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"AUTO\""); + matchFailed("\"UNIQ\""); } } if (result1 !== null) { - if (input.charCodeAt(pos) === 95) { - result2 = "_"; - pos++; + if (input.substr(pos, 2).toLowerCase() === "ue") { + result2 = input.substr(pos, 2); + pos += 2; } else { result2 = null; if (reportFailures === 0) { - matchFailed("\"_\""); + matchFailed("\"UE\""); } } - if (result2 === null) { - result2 = parse__(); - } + result2 = result2 !== null ? result2 : ""; if (result2 !== null) { - if (input.substr(pos, 3).toLowerCase() === "inc") { - result3 = input.substr(pos, 3); - pos += 3; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"INC\""); - } - } + result3 = parse__(); if (result3 !== null) { - if (input.substr(pos, 6).toLowerCase() === "rement") { - result4 = input.substr(pos, 6); - pos += 6; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("\"REMENT\""); - } - } - result4 = result4 !== null ? result4 : ""; + result4 = parse_COLUMN_TYPE_PROPERTIES(); if (result4 !== null) { - result5 = parse__(); - if (result5 !== null) { - result6 = parse_COLUMN_TYPE_PROPERTIES(); - if (result6 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3, result4]; } else { result0 = null; pos = pos1; @@ -10580,9 +10577,9 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.autoIncrement=true; + props.unique=true; return props; - })(pos0, result0[6]); + })(pos0, result0[4]); } if (result0 === null) { pos = pos0; @@ -10592,70 +10589,49 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 6).toLowerCase() === "collat") { - result1 = input.substr(pos, 6); - pos += 6; + if (input.substr(pos, 4).toLowerCase() === "auto") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"COLLAT\""); + matchFailed("\"AUTO\""); } } if (result1 !== null) { - if (input.substr(pos, 1).toLowerCase() === "e") { - result2 = input.substr(pos, 1); + if (input.charCodeAt(pos) === 95) { + result2 = "_"; pos++; } else { result2 = null; if (reportFailures === 0) { - matchFailed("\"E\""); + matchFailed("\"_\""); } } if (result2 === null) { - if (input.substr(pos, 3).toLowerCase() === "ion") { - result2 = input.substr(pos, 3); + result2 = parse__(); + } + if (result2 !== null) { + if (input.substr(pos, 3).toLowerCase() === "inc") { + result3 = input.substr(pos, 3); pos += 3; } else { - result2 = null; + result3 = null; if (reportFailures === 0) { - matchFailed("\"ION\""); + matchFailed("\"INC\""); } } - } - if (result2 !== null) { - pos2 = pos; - result3 = parse__(); if (result3 !== null) { - if (input.charCodeAt(pos) === 61) { - result4 = "="; - pos++; + if (input.substr(pos, 6).toLowerCase() === "rement") { + result4 = input.substr(pos, 6); + pos += 6; } else { result4 = null; if (reportFailures === 0) { - matchFailed("\"=\""); + matchFailed("\"REMENT\""); } } - if (result4 !== null) { - result5 = parse__(); - if (result5 !== null) { - result3 = [result3, result4, result5]; - } else { - result3 = null; - pos = pos2; - } - } else { - result3 = null; - pos = pos2; - } - } else { - result3 = null; - pos = pos2; - } - if (result3 === null) { - result3 = parse___(); - } - if (result3 !== null) { - result4 = parse_COLLATION_NAME(); + result4 = result4 !== null ? result4 : ""; if (result4 !== null) { result5 = parse__(); if (result5 !== null) { @@ -10691,10 +10667,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, collate, props) { - props.collate = collate; + result0 = (function(offset, props) { + props.autoIncrement=true; return props; - })(pos0, result0[4], result0[6]); + })(pos0, result0[6]); } if (result0 === null) { pos = pos0; @@ -10704,23 +10680,84 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "default") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 6).toLowerCase() === "collat") { + result1 = input.substr(pos, 6); + pos += 6; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"DEFAULT\""); + matchFailed("\"COLLAT\""); } } if (result1 !== null) { - result2 = parse___(); + if (input.substr(pos, 1).toLowerCase() === "e") { + result2 = input.substr(pos, 1); + pos++; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\"E\""); + } + } + if (result2 === null) { + if (input.substr(pos, 3).toLowerCase() === "ion") { + result2 = input.substr(pos, 3); + pos += 3; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\"ION\""); + } + } + } if (result2 !== null) { - result3 = parse_CONSTANT_EXPRESSION(); + pos2 = pos; + result3 = parse__(); if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); + if (input.charCodeAt(pos) === 61) { + result4 = "="; + pos++; + } else { + result4 = null; + if (reportFailures === 0) { + matchFailed("\"=\""); + } + } if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; + result5 = parse__(); + if (result5 !== null) { + result3 = [result3, result4, result5]; + } else { + result3 = null; + pos = pos2; + } + } else { + result3 = null; + pos = pos2; + } + } else { + result3 = null; + pos = pos2; + } + if (result3 === null) { + result3 = parse___(); + } + if (result3 !== null) { + result4 = parse_COLLATION_NAME(); + if (result4 !== null) { + result5 = parse__(); + if (result5 !== null) { + result6 = parse_COLUMN_TYPE_PROPERTIES(); + if (result6 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10742,10 +10779,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, value, props) { - props.default = value; + result0 = (function(offset, collate, props) { + props.collate = collate; return props; - })(pos0, result0[3], result0[4]); + })(pos0, result0[4], result0[6]); } if (result0 === null) { pos = pos0; @@ -10767,7 +10804,7 @@ module.exports = (function(){ if (result1 !== null) { result2 = parse___(); if (result2 !== null) { - result3 = parse_CURRENT_TIMESTAMP(); + result3 = parse_CONSTANT_EXPRESSION(); if (result3 !== null) { result4 = parse_COLUMN_TYPE_PROPERTIES(); if (result4 !== null) { @@ -10793,10 +10830,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, props) { - props.default = 'CURRENT_TIMESTAMP'; + result0 = (function(offset, value, props) { + props.default = value; return props; - })(pos0, result0[4]); + })(pos0, result0[3], result0[4]); } if (result0 === null) { pos = pos0; @@ -10806,49 +10843,23 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 2).toLowerCase() === "on") { - result1 = input.substr(pos, 2); - pos += 2; + if (input.substr(pos, 7).toLowerCase() === "default") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"ON\""); + matchFailed("\"DEFAULT\""); } } if (result1 !== null) { - result2 = parse__(); + result2 = parse___(); if (result2 !== null) { - if (input.substr(pos, 6).toLowerCase() === "update") { - result3 = input.substr(pos, 6); - pos += 6; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"UPDATE\""); - } - } + result3 = parse_CURRENT_TIMESTAMP(); if (result3 !== null) { - result4 = parse__(); + result4 = parse_COLUMN_TYPE_PROPERTIES(); if (result4 !== null) { - result5 = parse_CURRENT_TIMESTAMP(); - if (result5 !== null) { - result6 = parse__(); - if (result6 !== null) { - result7 = parse_COLUMN_TYPE_PROPERTIES(); - if (result7 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3, result4]; } else { result0 = null; pos = pos1; @@ -10870,10 +10881,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, val, props) { - props.onUpdate = val; + result0 = (function(offset, props) { + props.default = 'CURRENT_TIMESTAMP'; return props; - })(pos0, result0[5], result0[7]); + })(pos0, result0[4]); } if (result0 === null) { pos = pos0; @@ -10883,53 +10894,49 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "comment") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 2).toLowerCase() === "on") { + result1 = input.substr(pos, 2); + pos += 2; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"COMMENT\""); + matchFailed("\"ON\""); } } if (result1 !== null) { - pos2 = pos; result2 = parse__(); if (result2 !== null) { - if (input.charCodeAt(pos) === 61) { - result3 = "="; - pos++; + if (input.substr(pos, 6).toLowerCase() === "update") { + result3 = input.substr(pos, 6); + pos += 6; } else { result3 = null; if (reportFailures === 0) { - matchFailed("\"=\""); + matchFailed("\"UPDATE\""); } } if (result3 !== null) { result4 = parse__(); if (result4 !== null) { - result2 = [result2, result3, result4]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - if (result2 === null) { - result2 = parse___(); - } - if (result2 !== null) { - result3 = parse_STRING(); - if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; + result5 = parse_CURRENT_TIMESTAMP(); + if (result5 !== null) { + result6 = parse__(); + if (result6 !== null) { + result7 = parse_COLUMN_TYPE_PROPERTIES(); + if (result7 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10951,23 +10958,105 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, comment, props) { - props.comment = comment; + result0 = (function(offset, val, props) { + props.onUpdate = val; return props; - })(pos0, result0[3], result0[4]); + })(pos0, result0[5], result0[7]); } if (result0 === null) { pos = pos0; } if (result0 === null) { pos0 = pos; + pos1 = pos; result0 = parse__(); if (result0 !== null) { - result0 = (function(offset) { return {}; })(pos0); + if (input.substr(pos, 7).toLowerCase() === "comment") { + result1 = input.substr(pos, 7); + pos += 7; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("\"COMMENT\""); + } + } + if (result1 !== null) { + pos2 = pos; + result2 = parse__(); + if (result2 !== null) { + if (input.charCodeAt(pos) === 61) { + result3 = "="; + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"=\""); + } + } + if (result3 !== null) { + result4 = parse__(); + if (result4 !== null) { + result2 = [result2, result3, result4]; + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + if (result2 === null) { + result2 = parse___(); + } + if (result2 !== null) { + result3 = parse_STRING(); + if (result3 !== null) { + result4 = parse_COLUMN_TYPE_PROPERTIES(); + if (result4 !== null) { + result0 = [result0, result1, result2, result3, result4]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = (function(offset, comment, props) { + props.comment = comment; + return props; + })(pos0, result0[3], result0[4]); } if (result0 === null) { pos = pos0; } + if (result0 === null) { + pos0 = pos; + result0 = parse__(); + if (result0 !== null) { + result0 = (function(offset) { return {}; })(pos0); + } + if (result0 === null) { + pos = pos0; + } + } } } } diff --git a/tests/parser/13-01-14-create-table.js b/tests/parser/13-01-14-create-table.js index c6adb5f..07d269b 100644 --- a/tests/parser/13-01-14-create-table.js +++ b/tests/parser/13-01-14-create-table.js @@ -259,6 +259,16 @@ exports['Grammar: CREATE TABLE: valid input'] = rule_yields.bind(null, { type: 'CONSTRAINT', constraint: 'INDEX', unique: true, columns: [ {id: 'name', length: 10, } ] }, ] }] + ], [ + 'CREATE TABLE a (opts SET("blue", "red", "yellow"))', + [{ + statement: 'CREATE', + what: 'TABLE', + schema: undefined, + table: 'a', + definitions: [ { type: 'SET', name: 'opts', values: [ 'blue', 'red', 'yellow', ] }, + ] + }] ] ], 'deepEqual' ); From 2fc490e9ed70e997592e8051bd3d60fa7bd7d003 Mon Sep 17 00:00:00 2001 From: Shigeki Morimoto Date: Thu, 28 Sep 2017 18:02:51 +0900 Subject: [PATCH 4/8] Yet another VARCAHR BINARY. --- grammar/13-01-14-create-table.pegjs | 7 + lib/sqljs-parser.js | 1012 ++++++++++++++----------- tests/parser/13-01-14-create-table.js | 10 + 3 files changed, 566 insertions(+), 463 deletions(-) diff --git a/grammar/13-01-14-create-table.pegjs b/grammar/13-01-14-create-table.pegjs index 06bd4ea..1fe45d0 100644 --- a/grammar/13-01-14-create-table.pegjs +++ b/grammar/13-01-14-create-table.pegjs @@ -223,6 +223,13 @@ COLUMN_TYPE_PROPERTIES "Column type properties" if(length) props.length = length; return props; } + / _ ("VARBINARY"i/"VARCHAR"i) length:TYPE_LENGTH _ "BINARY"i _ props:COLUMN_TYPE_PROPERTIES { + if(props.type) + throw new SyntaxError("Ambiguous type"); + props.type = 'VARBINARY'; + if(length) props.length = length; + return props; + } / _ ("VARCHAR"i/"CHARACTER"i __ "VARYING"i) length:TYPE_LENGTH props:COLUMN_TYPE_PROPERTIES { if(props.type) throw new SyntaxError("Ambiguous type"); diff --git a/lib/sqljs-parser.js b/lib/sqljs-parser.js index 50c506b..b4f48e6 100644 --- a/lib/sqljs-parser.js +++ b/lib/sqljs-parser.js @@ -9657,59 +9657,58 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "varchar") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 9).toLowerCase() === "varbinary") { + result1 = input.substr(pos, 9); + pos += 9; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"VARCHAR\""); + matchFailed("\"VARBINARY\""); } } if (result1 === null) { - pos2 = pos; - if (input.substr(pos, 9).toLowerCase() === "character") { - result1 = input.substr(pos, 9); - pos += 9; + if (input.substr(pos, 7).toLowerCase() === "varchar") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"CHARACTER\""); + matchFailed("\"VARCHAR\""); } } - if (result1 !== null) { - result2 = parse___(); - if (result2 !== null) { - if (input.substr(pos, 7).toLowerCase() === "varying") { - result3 = input.substr(pos, 7); - pos += 7; + } + if (result1 !== null) { + result2 = parse_TYPE_LENGTH(); + if (result2 !== null) { + result3 = parse__(); + if (result3 !== null) { + if (input.substr(pos, 6).toLowerCase() === "binary") { + result4 = input.substr(pos, 6); + pos += 6; } else { - result3 = null; + result4 = null; if (reportFailures === 0) { - matchFailed("\"VARYING\""); + matchFailed("\"BINARY\""); } } - if (result3 !== null) { - result1 = [result1, result2, result3]; + if (result4 !== null) { + result5 = parse__(); + if (result5 !== null) { + result6 = parse_COLUMN_TYPE_PROPERTIES(); + if (result6 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { - result1 = null; - pos = pos2; + result0 = null; + pos = pos1; } - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - } - if (result1 !== null) { - result2 = parse_TYPE_LENGTH(); - if (result2 !== null) { - result3 = parse_COLUMN_TYPE_PROPERTIES(); - if (result3 !== null) { - result0 = [result0, result1, result2, result3]; } else { result0 = null; pos = pos1; @@ -9730,10 +9729,10 @@ module.exports = (function(){ result0 = (function(offset, length, props) { if(props.type) throw new SyntaxError("Ambiguous type"); - props.type = 'VARCHAR'; + props.type = 'VARBINARY'; if(length) props.length = length; return props; - })(pos0, result0[2], result0[3]); + })(pos0, result0[2], result0[6]); } if (result0 === null) { pos = pos0; @@ -9743,16 +9742,17 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "char") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 7).toLowerCase() === "varchar") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"CHAR\""); + matchFailed("\"VARCHAR\""); } } if (result1 === null) { + pos2 = pos; if (input.substr(pos, 9).toLowerCase() === "character") { result1 = input.substr(pos, 9); pos += 9; @@ -9762,6 +9762,32 @@ module.exports = (function(){ matchFailed("\"CHARACTER\""); } } + if (result1 !== null) { + result2 = parse___(); + if (result2 !== null) { + if (input.substr(pos, 7).toLowerCase() === "varying") { + result3 = input.substr(pos, 7); + pos += 7; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"VARYING\""); + } + } + if (result3 !== null) { + result1 = [result1, result2, result3]; + } else { + result1 = null; + pos = pos2; + } + } else { + result1 = null; + pos = pos2; + } + } else { + result1 = null; + pos = pos2; + } } if (result1 !== null) { result2 = parse_TYPE_LENGTH(); @@ -9789,7 +9815,7 @@ module.exports = (function(){ result0 = (function(offset, length, props) { if(props.type) throw new SyntaxError("Ambiguous type"); - props.type = 'CHAR'; + props.type = 'VARCHAR'; if(length) props.length = length; return props; })(pos0, result0[2], result0[3]); @@ -9802,61 +9828,28 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - pos2 = pos; - if (input.substr(pos, 4).toLowerCase() === "tiny") { + if (input.substr(pos, 4).toLowerCase() === "char") { result1 = input.substr(pos, 4); pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"TINY\""); + matchFailed("\"CHAR\""); } } if (result1 === null) { - if (input.substr(pos, 6).toLowerCase() === "medium") { - result1 = input.substr(pos, 6); - pos += 6; + if (input.substr(pos, 9).toLowerCase() === "character") { + result1 = input.substr(pos, 9); + pos += 9; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"MEDIUM\""); - } - } - if (result1 === null) { - if (input.substr(pos, 4).toLowerCase() === "long") { - result1 = input.substr(pos, 4); - pos += 4; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"LONG\""); - } + matchFailed("\"CHARACTER\""); } } } - result1 = result1 !== null ? result1 : ""; if (result1 !== null) { - result2 = parse__(); - if (result2 !== null) { - result1 = [result1, result2]; - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - if (result1 !== null) { - if (input.substr(pos, 4).toLowerCase() === "text") { - result2 = input.substr(pos, 4); - pos += 4; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"TEXT\""); - } - } + result2 = parse_TYPE_LENGTH(); if (result2 !== null) { result3 = parse_COLUMN_TYPE_PROPERTIES(); if (result3 !== null) { @@ -9878,12 +9871,13 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, prefix, props) { + result0 = (function(offset, length, props) { if(props.type) throw new SyntaxError("Ambiguous type"); - props.type = typeof prefix !== 'undefined' ? prefix.toUpperCase()+'TEXT' : 'TEXT'; + props.type = 'CHAR'; + if(length) props.length = length; return props; - })(pos0, result0[1][0], result0[3]); + })(pos0, result0[2], result0[3]); } if (result0 === null) { pos = pos0; @@ -9939,13 +9933,13 @@ module.exports = (function(){ pos = pos2; } if (result1 !== null) { - if (input.substr(pos, 4).toLowerCase() === "blob") { + if (input.substr(pos, 4).toLowerCase() === "text") { result2 = input.substr(pos, 4); pos += 4; } else { result2 = null; if (reportFailures === 0) { - matchFailed("\"BLOB\""); + matchFailed("\"TEXT\""); } } if (result2 !== null) { @@ -9972,7 +9966,7 @@ module.exports = (function(){ result0 = (function(offset, prefix, props) { if(props.type) throw new SyntaxError("Ambiguous type"); - props.type = typeof prefix !== 'undefined' ? prefix.toUpperCase()+'BLOB' : 'BLOB'; + props.type = typeof prefix !== 'undefined' ? prefix.toUpperCase()+'TEXT' : 'TEXT'; return props; })(pos0, result0[1][0], result0[3]); } @@ -9984,71 +9978,65 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 8).toLowerCase() === "datetime") { - result1 = input.substr(pos, 8); - pos += 8; + pos2 = pos; + if (input.substr(pos, 4).toLowerCase() === "tiny") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"DATETIME\""); + matchFailed("\"TINY\""); } } if (result1 === null) { - if (input.substr(pos, 4).toLowerCase() === "date") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 6).toLowerCase() === "medium") { + result1 = input.substr(pos, 6); + pos += 6; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"DATE\""); + matchFailed("\"MEDIUM\""); } } if (result1 === null) { - if (input.substr(pos, 9).toLowerCase() === "timestamp") { - result1 = input.substr(pos, 9); - pos += 9; + if (input.substr(pos, 4).toLowerCase() === "long") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"TIMESTAMP\""); - } - } - if (result1 === null) { - if (input.substr(pos, 4).toLowerCase() === "time") { - result1 = input.substr(pos, 4); - pos += 4; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"TIME\""); - } - } - if (result1 === null) { - if (input.substr(pos, 4).toLowerCase() === "year") { - result1 = input.substr(pos, 4); - pos += 4; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"YEAR\""); - } - } + matchFailed("\"LONG\""); } } } } + result1 = result1 !== null ? result1 : ""; if (result1 !== null) { - result2 = parse_TYPE_LENGTH(); + result2 = parse__(); if (result2 !== null) { - result3 = parse__(); + result1 = [result1, result2]; + } else { + result1 = null; + pos = pos2; + } + } else { + result1 = null; + pos = pos2; + } + if (result1 !== null) { + if (input.substr(pos, 4).toLowerCase() === "blob") { + result2 = input.substr(pos, 4); + pos += 4; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\"BLOB\""); + } + } + if (result2 !== null) { + result3 = parse_COLUMN_TYPE_PROPERTIES(); if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3]; } else { result0 = null; pos = pos1; @@ -10066,13 +10054,12 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, type, length, props) { + result0 = (function(offset, prefix, props) { if(props.type) throw new SyntaxError("Ambiguous type"); - props.type = type.toUpperCase(); - if(length) props.length = length; + props.type = typeof prefix !== 'undefined' ? prefix.toUpperCase()+'BLOB' : 'BLOB'; return props; - })(pos0, result0[1], result0[2], result0[4]); + })(pos0, result0[1][0], result0[3]); } if (result0 === null) { pos = pos0; @@ -10082,57 +10069,67 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "enum") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 8).toLowerCase() === "datetime") { + result1 = input.substr(pos, 8); + pos += 8; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"ENUM\""); + matchFailed("\"DATETIME\""); } } - if (result1 !== null) { - result2 = parse__(); - if (result2 !== null) { - if (input.charCodeAt(pos) === 40) { - result3 = "("; - pos++; + if (result1 === null) { + if (input.substr(pos, 4).toLowerCase() === "date") { + result1 = input.substr(pos, 4); + pos += 4; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("\"DATE\""); + } + } + if (result1 === null) { + if (input.substr(pos, 9).toLowerCase() === "timestamp") { + result1 = input.substr(pos, 9); + pos += 9; } else { - result3 = null; + result1 = null; if (reportFailures === 0) { - matchFailed("\"(\""); + matchFailed("\"TIMESTAMP\""); } } - if (result3 !== null) { - result4 = parse_STRING_ID_LIST(); - if (result4 !== null) { - if (input.charCodeAt(pos) === 41) { - result5 = ")"; - pos++; + if (result1 === null) { + if (input.substr(pos, 4).toLowerCase() === "time") { + result1 = input.substr(pos, 4); + pos += 4; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("\"TIME\""); + } + } + if (result1 === null) { + if (input.substr(pos, 4).toLowerCase() === "year") { + result1 = input.substr(pos, 4); + pos += 4; } else { - result5 = null; + result1 = null; if (reportFailures === 0) { - matchFailed("\")\""); - } - } - if (result5 !== null) { - result6 = parse__(); - if (result6 !== null) { - result7 = parse_COLUMN_TYPE_PROPERTIES(); - if (result7 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; + matchFailed("\"YEAR\""); } - } else { - result0 = null; - pos = pos1; } + } + } + } + } + if (result1 !== null) { + result2 = parse_TYPE_LENGTH(); + if (result2 !== null) { + result3 = parse__(); + if (result3 !== null) { + result4 = parse_COLUMN_TYPE_PROPERTIES(); + if (result4 !== null) { + result0 = [result0, result1, result2, result3, result4]; } else { result0 = null; pos = pos1; @@ -10154,13 +10151,13 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, values, props) { + result0 = (function(offset, type, length, props) { if(props.type) throw new SyntaxError("Ambiguous type"); - props.type = 'ENUM'; - props.values = values; + props.type = type.toUpperCase(); + if(length) props.length = length; return props; - })(pos0, result0[4], result0[7]); + })(pos0, result0[1], result0[2], result0[4]); } if (result0 === null) { pos = pos0; @@ -10170,13 +10167,13 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 3).toLowerCase() === "set") { - result1 = input.substr(pos, 3); - pos += 3; + if (input.substr(pos, 4).toLowerCase() === "enum") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"SET\""); + matchFailed("\"ENUM\""); } } if (result1 !== null) { @@ -10245,7 +10242,7 @@ module.exports = (function(){ result0 = (function(offset, values, props) { if(props.type) throw new SyntaxError("Ambiguous type"); - props.type = 'SET'; + props.type = 'ENUM'; props.values = values; return props; })(pos0, result0[4], result0[7]); @@ -10258,21 +10255,61 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 8).toLowerCase() === "unsigned") { - result1 = input.substr(pos, 8); - pos += 8; + if (input.substr(pos, 3).toLowerCase() === "set") { + result1 = input.substr(pos, 3); + pos += 3; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"UNSIGNED\""); + matchFailed("\"SET\""); } } if (result1 !== null) { result2 = parse__(); if (result2 !== null) { - result3 = parse_COLUMN_TYPE_PROPERTIES(); + if (input.charCodeAt(pos) === 40) { + result3 = "("; + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"(\""); + } + } if (result3 !== null) { - result0 = [result0, result1, result2, result3]; + result4 = parse_STRING_ID_LIST(); + if (result4 !== null) { + if (input.charCodeAt(pos) === 41) { + result5 = ")"; + pos++; + } else { + result5 = null; + if (reportFailures === 0) { + matchFailed("\")\""); + } + } + if (result5 !== null) { + result6 = parse__(); + if (result6 !== null) { + result7 = parse_COLUMN_TYPE_PROPERTIES(); + if (result7 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10290,10 +10327,13 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, props) { - props.unsigned=true; - return props; - })(pos0, result0[3]); + result0 = (function(offset, values, props) { + if(props.type) + throw new SyntaxError("Ambiguous type"); + props.type = 'SET'; + props.values = values; + return props; + })(pos0, result0[4], result0[7]); } if (result0 === null) { pos = pos0; @@ -10303,13 +10343,13 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 6).toLowerCase() === "signed") { - result1 = input.substr(pos, 6); - pos += 6; + if (input.substr(pos, 8).toLowerCase() === "unsigned") { + result1 = input.substr(pos, 8); + pos += 8; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"SIGNED\""); + matchFailed("\"UNSIGNED\""); } } if (result1 !== null) { @@ -10336,7 +10376,7 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.signed=true; + props.unsigned=true; return props; })(pos0, result0[3]); } @@ -10348,41 +10388,21 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 3).toLowerCase() === "not") { - result1 = input.substr(pos, 3); - pos += 3; + if (input.substr(pos, 6).toLowerCase() === "signed") { + result1 = input.substr(pos, 6); + pos += 6; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"NOT\""); + matchFailed("\"SIGNED\""); } } if (result1 !== null) { result2 = parse__(); if (result2 !== null) { - if (input.substr(pos, 4).toLowerCase() === "null") { - result3 = input.substr(pos, 4); - pos += 4; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"NULL\""); - } - } + result3 = parse_COLUMN_TYPE_PROPERTIES(); if (result3 !== null) { - result4 = parse__(); - if (result4 !== null) { - result5 = parse_COLUMN_TYPE_PROPERTIES(); - if (result5 !== null) { - result0 = [result0, result1, result2, result3, result4, result5]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3]; } else { result0 = null; pos = pos1; @@ -10401,11 +10421,9 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - if(typeof props.notNull !== 'undefined') - throw new Error('NULL or NOT NULL?'); - props.notNull=true; - return props; - })(pos0, result0[5]); + props.signed=true; + return props; + })(pos0, result0[3]); } if (result0 === null) { pos = pos0; @@ -10415,19 +10433,45 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "null") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 3).toLowerCase() === "not") { + result1 = input.substr(pos, 3); + pos += 3; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"NULL\""); + matchFailed("\"NOT\""); } } if (result1 !== null) { - result2 = parse_COLUMN_TYPE_PROPERTIES(); + result2 = parse__(); if (result2 !== null) { - result0 = [result0, result1, result2]; + if (input.substr(pos, 4).toLowerCase() === "null") { + result3 = input.substr(pos, 4); + pos += 4; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"NULL\""); + } + } + if (result3 !== null) { + result4 = parse__(); + if (result4 !== null) { + result5 = parse_COLUMN_TYPE_PROPERTIES(); + if (result5 !== null) { + result0 = [result0, result1, result2, result3, result4, result5]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10444,9 +10488,9 @@ module.exports = (function(){ result0 = (function(offset, props) { if(typeof props.notNull !== 'undefined') throw new Error('NULL or NOT NULL?'); - props.notNull=false; + props.notNull=true; return props; - })(pos0, result0[2]); + })(pos0, result0[5]); } if (result0 === null) { pos = pos0; @@ -10456,53 +10500,19 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "primary") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 4).toLowerCase() === "null") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"PRIMARY\""); + matchFailed("\"NULL\""); } } if (result1 !== null) { - pos2 = pos; - result2 = parse__(); + result2 = parse_COLUMN_TYPE_PROPERTIES(); if (result2 !== null) { - if (input.substr(pos, 3).toLowerCase() === "key") { - result3 = input.substr(pos, 3); - pos += 3; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"KEY\""); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result3 = parse__(); - if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2]; } else { result0 = null; pos = pos1; @@ -10517,9 +10527,11 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.primaryKey=true; + if(typeof props.notNull !== 'undefined') + throw new Error('NULL or NOT NULL?'); + props.notNull=false; return props; - })(pos0, result0[4]); + })(pos0, result0[2]); } if (result0 === null) { pos = pos0; @@ -10529,24 +10541,37 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "uniq") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 7).toLowerCase() === "primary") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"UNIQ\""); + matchFailed("\"PRIMARY\""); } } if (result1 !== null) { - if (input.substr(pos, 2).toLowerCase() === "ue") { - result2 = input.substr(pos, 2); - pos += 2; + pos2 = pos; + result2 = parse__(); + if (result2 !== null) { + if (input.substr(pos, 3).toLowerCase() === "key") { + result3 = input.substr(pos, 3); + pos += 3; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"KEY\""); + } + } + if (result3 !== null) { + result2 = [result2, result3]; + } else { + result2 = null; + pos = pos2; + } } else { result2 = null; - if (reportFailures === 0) { - matchFailed("\"UE\""); - } + pos = pos2; } result2 = result2 !== null ? result2 : ""; if (result2 !== null) { @@ -10577,7 +10602,7 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.unique=true; + props.primaryKey=true; return props; })(pos0, result0[4]); } @@ -10589,63 +10614,32 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "auto") { + if (input.substr(pos, 4).toLowerCase() === "uniq") { result1 = input.substr(pos, 4); pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"AUTO\""); + matchFailed("\"UNIQ\""); } } if (result1 !== null) { - if (input.charCodeAt(pos) === 95) { - result2 = "_"; - pos++; + if (input.substr(pos, 2).toLowerCase() === "ue") { + result2 = input.substr(pos, 2); + pos += 2; } else { result2 = null; if (reportFailures === 0) { - matchFailed("\"_\""); + matchFailed("\"UE\""); } } - if (result2 === null) { - result2 = parse__(); - } + result2 = result2 !== null ? result2 : ""; if (result2 !== null) { - if (input.substr(pos, 3).toLowerCase() === "inc") { - result3 = input.substr(pos, 3); - pos += 3; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"INC\""); - } - } + result3 = parse__(); if (result3 !== null) { - if (input.substr(pos, 6).toLowerCase() === "rement") { - result4 = input.substr(pos, 6); - pos += 6; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("\"REMENT\""); - } - } - result4 = result4 !== null ? result4 : ""; + result4 = parse_COLUMN_TYPE_PROPERTIES(); if (result4 !== null) { - result5 = parse__(); - if (result5 !== null) { - result6 = parse_COLUMN_TYPE_PROPERTIES(); - if (result6 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3, result4]; } else { result0 = null; pos = pos1; @@ -10668,9 +10662,9 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.autoIncrement=true; + props.unique=true; return props; - })(pos0, result0[6]); + })(pos0, result0[4]); } if (result0 === null) { pos = pos0; @@ -10680,70 +10674,49 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 6).toLowerCase() === "collat") { - result1 = input.substr(pos, 6); - pos += 6; + if (input.substr(pos, 4).toLowerCase() === "auto") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"COLLAT\""); + matchFailed("\"AUTO\""); } } if (result1 !== null) { - if (input.substr(pos, 1).toLowerCase() === "e") { - result2 = input.substr(pos, 1); + if (input.charCodeAt(pos) === 95) { + result2 = "_"; pos++; } else { result2 = null; if (reportFailures === 0) { - matchFailed("\"E\""); + matchFailed("\"_\""); } } if (result2 === null) { - if (input.substr(pos, 3).toLowerCase() === "ion") { - result2 = input.substr(pos, 3); + result2 = parse__(); + } + if (result2 !== null) { + if (input.substr(pos, 3).toLowerCase() === "inc") { + result3 = input.substr(pos, 3); pos += 3; } else { - result2 = null; + result3 = null; if (reportFailures === 0) { - matchFailed("\"ION\""); + matchFailed("\"INC\""); } } - } - if (result2 !== null) { - pos2 = pos; - result3 = parse__(); if (result3 !== null) { - if (input.charCodeAt(pos) === 61) { - result4 = "="; - pos++; + if (input.substr(pos, 6).toLowerCase() === "rement") { + result4 = input.substr(pos, 6); + pos += 6; } else { result4 = null; if (reportFailures === 0) { - matchFailed("\"=\""); + matchFailed("\"REMENT\""); } } - if (result4 !== null) { - result5 = parse__(); - if (result5 !== null) { - result3 = [result3, result4, result5]; - } else { - result3 = null; - pos = pos2; - } - } else { - result3 = null; - pos = pos2; - } - } else { - result3 = null; - pos = pos2; - } - if (result3 === null) { - result3 = parse___(); - } - if (result3 !== null) { - result4 = parse_COLLATION_NAME(); + result4 = result4 !== null ? result4 : ""; if (result4 !== null) { result5 = parse__(); if (result5 !== null) { @@ -10779,10 +10752,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, collate, props) { - props.collate = collate; + result0 = (function(offset, props) { + props.autoIncrement=true; return props; - })(pos0, result0[4], result0[6]); + })(pos0, result0[6]); } if (result0 === null) { pos = pos0; @@ -10792,23 +10765,84 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "default") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 6).toLowerCase() === "collat") { + result1 = input.substr(pos, 6); + pos += 6; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"DEFAULT\""); + matchFailed("\"COLLAT\""); } } if (result1 !== null) { - result2 = parse___(); + if (input.substr(pos, 1).toLowerCase() === "e") { + result2 = input.substr(pos, 1); + pos++; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\"E\""); + } + } + if (result2 === null) { + if (input.substr(pos, 3).toLowerCase() === "ion") { + result2 = input.substr(pos, 3); + pos += 3; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\"ION\""); + } + } + } if (result2 !== null) { - result3 = parse_CONSTANT_EXPRESSION(); + pos2 = pos; + result3 = parse__(); + if (result3 !== null) { + if (input.charCodeAt(pos) === 61) { + result4 = "="; + pos++; + } else { + result4 = null; + if (reportFailures === 0) { + matchFailed("\"=\""); + } + } + if (result4 !== null) { + result5 = parse__(); + if (result5 !== null) { + result3 = [result3, result4, result5]; + } else { + result3 = null; + pos = pos2; + } + } else { + result3 = null; + pos = pos2; + } + } else { + result3 = null; + pos = pos2; + } + if (result3 === null) { + result3 = parse___(); + } if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); + result4 = parse_COLLATION_NAME(); if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; + result5 = parse__(); + if (result5 !== null) { + result6 = parse_COLUMN_TYPE_PROPERTIES(); + if (result6 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10830,10 +10864,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, value, props) { - props.default = value; + result0 = (function(offset, collate, props) { + props.collate = collate; return props; - })(pos0, result0[3], result0[4]); + })(pos0, result0[4], result0[6]); } if (result0 === null) { pos = pos0; @@ -10855,7 +10889,7 @@ module.exports = (function(){ if (result1 !== null) { result2 = parse___(); if (result2 !== null) { - result3 = parse_CURRENT_TIMESTAMP(); + result3 = parse_CONSTANT_EXPRESSION(); if (result3 !== null) { result4 = parse_COLUMN_TYPE_PROPERTIES(); if (result4 !== null) { @@ -10881,10 +10915,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, props) { - props.default = 'CURRENT_TIMESTAMP'; + result0 = (function(offset, value, props) { + props.default = value; return props; - })(pos0, result0[4]); + })(pos0, result0[3], result0[4]); } if (result0 === null) { pos = pos0; @@ -10894,49 +10928,23 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 2).toLowerCase() === "on") { - result1 = input.substr(pos, 2); - pos += 2; + if (input.substr(pos, 7).toLowerCase() === "default") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"ON\""); + matchFailed("\"DEFAULT\""); } } if (result1 !== null) { - result2 = parse__(); + result2 = parse___(); if (result2 !== null) { - if (input.substr(pos, 6).toLowerCase() === "update") { - result3 = input.substr(pos, 6); - pos += 6; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"UPDATE\""); - } - } + result3 = parse_CURRENT_TIMESTAMP(); if (result3 !== null) { - result4 = parse__(); + result4 = parse_COLUMN_TYPE_PROPERTIES(); if (result4 !== null) { - result5 = parse_CURRENT_TIMESTAMP(); - if (result5 !== null) { - result6 = parse__(); - if (result6 !== null) { - result7 = parse_COLUMN_TYPE_PROPERTIES(); - if (result7 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3, result4]; } else { result0 = null; pos = pos1; @@ -10958,10 +10966,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, val, props) { - props.onUpdate = val; + result0 = (function(offset, props) { + props.default = 'CURRENT_TIMESTAMP'; return props; - })(pos0, result0[5], result0[7]); + })(pos0, result0[4]); } if (result0 === null) { pos = pos0; @@ -10971,53 +10979,49 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "comment") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 2).toLowerCase() === "on") { + result1 = input.substr(pos, 2); + pos += 2; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"COMMENT\""); + matchFailed("\"ON\""); } } if (result1 !== null) { - pos2 = pos; result2 = parse__(); if (result2 !== null) { - if (input.charCodeAt(pos) === 61) { - result3 = "="; - pos++; + if (input.substr(pos, 6).toLowerCase() === "update") { + result3 = input.substr(pos, 6); + pos += 6; } else { result3 = null; if (reportFailures === 0) { - matchFailed("\"=\""); + matchFailed("\"UPDATE\""); } } if (result3 !== null) { result4 = parse__(); if (result4 !== null) { - result2 = [result2, result3, result4]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - if (result2 === null) { - result2 = parse___(); - } - if (result2 !== null) { - result3 = parse_STRING(); - if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; + result5 = parse_CURRENT_TIMESTAMP(); + if (result5 !== null) { + result6 = parse__(); + if (result6 !== null) { + result7 = parse_COLUMN_TYPE_PROPERTIES(); + if (result7 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -11039,23 +11043,105 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, comment, props) { - props.comment = comment; + result0 = (function(offset, val, props) { + props.onUpdate = val; return props; - })(pos0, result0[3], result0[4]); + })(pos0, result0[5], result0[7]); } if (result0 === null) { pos = pos0; } if (result0 === null) { pos0 = pos; + pos1 = pos; result0 = parse__(); if (result0 !== null) { - result0 = (function(offset) { return {}; })(pos0); + if (input.substr(pos, 7).toLowerCase() === "comment") { + result1 = input.substr(pos, 7); + pos += 7; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("\"COMMENT\""); + } + } + if (result1 !== null) { + pos2 = pos; + result2 = parse__(); + if (result2 !== null) { + if (input.charCodeAt(pos) === 61) { + result3 = "="; + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"=\""); + } + } + if (result3 !== null) { + result4 = parse__(); + if (result4 !== null) { + result2 = [result2, result3, result4]; + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + if (result2 === null) { + result2 = parse___(); + } + if (result2 !== null) { + result3 = parse_STRING(); + if (result3 !== null) { + result4 = parse_COLUMN_TYPE_PROPERTIES(); + if (result4 !== null) { + result0 = [result0, result1, result2, result3, result4]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = (function(offset, comment, props) { + props.comment = comment; + return props; + })(pos0, result0[3], result0[4]); } if (result0 === null) { pos = pos0; } + if (result0 === null) { + pos0 = pos; + result0 = parse__(); + if (result0 !== null) { + result0 = (function(offset) { return {}; })(pos0); + } + if (result0 === null) { + pos = pos0; + } + } } } } diff --git a/tests/parser/13-01-14-create-table.js b/tests/parser/13-01-14-create-table.js index 07d269b..bd56d6d 100644 --- a/tests/parser/13-01-14-create-table.js +++ b/tests/parser/13-01-14-create-table.js @@ -269,6 +269,16 @@ exports['Grammar: CREATE TABLE: valid input'] = rule_yields.bind(null, definitions: [ { type: 'SET', name: 'opts', values: [ 'blue', 'red', 'yellow', ] }, ] }] + ], [ + 'CREATE TABLE a (name VARCHAR(255) BINARY NOT NULL)', + [{ + statement: 'CREATE', + what: 'TABLE', + schema: undefined, + table: 'a', + definitions: [ { type: 'VARBINARY', name: 'name', length: 255, notNull: true }, + ] + }] ] ], 'deepEqual' ); From ba6671226e9766f76065133f03e170b48a501f38 Mon Sep 17 00:00:00 2001 From: Shigeki Morimoto Date: Thu, 28 Sep 2017 18:33:20 +0900 Subject: [PATCH 5/8] Fix. --- grammar/13-01-14-create-table.pegjs | 4 ++-- lib/sqljs-parser.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/grammar/13-01-14-create-table.pegjs b/grammar/13-01-14-create-table.pegjs index 1fe45d0..4c5a782 100644 --- a/grammar/13-01-14-create-table.pegjs +++ b/grammar/13-01-14-create-table.pegjs @@ -95,9 +95,9 @@ CREATE_DEFINITION_CONSTRAINT }; } / "UNIQUE"i _ type:("KEY"i/"INDEX"i)? - name:(__ name:(ID/STRING) {return name;})? _ "(" _ idlist:INDEX_COL_NAME_LIST ")" _ + name:(_ name:(ID/STRING) {return name;})? _ "(" _ idlist:INDEX_COL_NAME_LIST ")" _ { - if(!key && name) { + if(!key && name && name.match(/KEY|INDEX/i)) { key = name name = undefined } diff --git a/lib/sqljs-parser.js b/lib/sqljs-parser.js index b4f48e6..75e8125 100644 --- a/lib/sqljs-parser.js +++ b/lib/sqljs-parser.js @@ -7994,7 +7994,7 @@ module.exports = (function(){ if (result2 !== null) { pos2 = pos; pos3 = pos; - result3 = parse___(); + result3 = parse__(); if (result3 !== null) { result4 = parse_ID(); if (result4 === null) { @@ -8089,7 +8089,7 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, type, name, idlist) { - if(!key && name) { + if(!key && name && name.match(/KEY|INDEX/i)) { key = name name = undefined } From a3c29e9d6f70075ad83e1e3a89370b8ccad703a1 Mon Sep 17 00:00:00 2001 From: Shigeki Morimoto Date: Thu, 28 Sep 2017 18:57:06 +0900 Subject: [PATCH 6/8] Add Boolean type --- grammar/13-01-14-create-table.pegjs | 6 + lib/parse-options.js | 8 +- lib/sqljs-parser.js | 718 ++++++++++++++------------ tests/parser/13-01-14-create-table.js | 10 + 4 files changed, 403 insertions(+), 339 deletions(-) diff --git a/grammar/13-01-14-create-table.pegjs b/grammar/13-01-14-create-table.pegjs index 4c5a782..a83ac8e 100644 --- a/grammar/13-01-14-create-table.pegjs +++ b/grammar/13-01-14-create-table.pegjs @@ -265,6 +265,12 @@ COLUMN_TYPE_PROPERTIES "Column type properties" if(length) props.length = length; return props; } + / _ "BOOLEAN"i _ props:COLUMN_TYPE_PROPERTIES { + if(props.type) + throw new SyntaxError("Ambiguous type"); + props.type = 'BOOLEAN'; + return props; + } / _ "ENUM"i _ "(" values:STRING_ID_LIST ")" _ props:COLUMN_TYPE_PROPERTIES { if(props.type) throw new SyntaxError("Ambiguous type"); diff --git a/lib/parse-options.js b/lib/parse-options.js index 73ad4d3..9a64661 100644 --- a/lib/parse-options.js +++ b/lib/parse-options.js @@ -123,7 +123,7 @@ ParseOptions.prototype.resolveConstantExpressionObject = function(expr) { return this.resolveConstantExpressionBinary(expr); } - throw new Error("Cannot resolve expression as a constant: " + expr); + throw new Error("Cannot resolve expression as a constant: [" + expr + "]"); }; @@ -206,10 +206,10 @@ ParseOptions.prototype.resolveConstantExpression = function(expr) { return expr; case 'string': return expr; + case 'boolean': + return expr; case 'object': return this.resolveConstantExpressionObject(expr); } - throw new Error("Cannot resolve expression as a constant"); + throw new Error("Cannot resolve expression as a constant [" + typeof expr + "][" + expr + "]"); }; - - diff --git a/lib/sqljs-parser.js b/lib/sqljs-parser.js index 75e8125..48c56dc 100644 --- a/lib/sqljs-parser.js +++ b/lib/sqljs-parser.js @@ -10167,61 +10167,21 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "enum") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 7).toLowerCase() === "boolean") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"ENUM\""); + matchFailed("\"BOOLEAN\""); } } if (result1 !== null) { result2 = parse__(); if (result2 !== null) { - if (input.charCodeAt(pos) === 40) { - result3 = "("; - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"(\""); - } - } + result3 = parse_COLUMN_TYPE_PROPERTIES(); if (result3 !== null) { - result4 = parse_STRING_ID_LIST(); - if (result4 !== null) { - if (input.charCodeAt(pos) === 41) { - result5 = ")"; - pos++; - } else { - result5 = null; - if (reportFailures === 0) { - matchFailed("\")\""); - } - } - if (result5 !== null) { - result6 = parse__(); - if (result6 !== null) { - result7 = parse_COLUMN_TYPE_PROPERTIES(); - if (result7 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3]; } else { result0 = null; pos = pos1; @@ -10239,13 +10199,12 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, values, props) { + result0 = (function(offset, props) { if(props.type) throw new SyntaxError("Ambiguous type"); - props.type = 'ENUM'; - props.values = values; + props.type = 'BOOLEAN'; return props; - })(pos0, result0[4], result0[7]); + })(pos0, result0[3]); } if (result0 === null) { pos = pos0; @@ -10255,13 +10214,13 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 3).toLowerCase() === "set") { - result1 = input.substr(pos, 3); - pos += 3; + if (input.substr(pos, 4).toLowerCase() === "enum") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"SET\""); + matchFailed("\"ENUM\""); } } if (result1 !== null) { @@ -10330,7 +10289,7 @@ module.exports = (function(){ result0 = (function(offset, values, props) { if(props.type) throw new SyntaxError("Ambiguous type"); - props.type = 'SET'; + props.type = 'ENUM'; props.values = values; return props; })(pos0, result0[4], result0[7]); @@ -10343,21 +10302,61 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 8).toLowerCase() === "unsigned") { - result1 = input.substr(pos, 8); - pos += 8; + if (input.substr(pos, 3).toLowerCase() === "set") { + result1 = input.substr(pos, 3); + pos += 3; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"UNSIGNED\""); + matchFailed("\"SET\""); } } if (result1 !== null) { result2 = parse__(); if (result2 !== null) { - result3 = parse_COLUMN_TYPE_PROPERTIES(); + if (input.charCodeAt(pos) === 40) { + result3 = "("; + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"(\""); + } + } if (result3 !== null) { - result0 = [result0, result1, result2, result3]; + result4 = parse_STRING_ID_LIST(); + if (result4 !== null) { + if (input.charCodeAt(pos) === 41) { + result5 = ")"; + pos++; + } else { + result5 = null; + if (reportFailures === 0) { + matchFailed("\")\""); + } + } + if (result5 !== null) { + result6 = parse__(); + if (result6 !== null) { + result7 = parse_COLUMN_TYPE_PROPERTIES(); + if (result7 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10375,10 +10374,13 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, props) { - props.unsigned=true; - return props; - })(pos0, result0[3]); + result0 = (function(offset, values, props) { + if(props.type) + throw new SyntaxError("Ambiguous type"); + props.type = 'SET'; + props.values = values; + return props; + })(pos0, result0[4], result0[7]); } if (result0 === null) { pos = pos0; @@ -10388,13 +10390,13 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 6).toLowerCase() === "signed") { - result1 = input.substr(pos, 6); - pos += 6; + if (input.substr(pos, 8).toLowerCase() === "unsigned") { + result1 = input.substr(pos, 8); + pos += 8; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"SIGNED\""); + matchFailed("\"UNSIGNED\""); } } if (result1 !== null) { @@ -10421,7 +10423,7 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.signed=true; + props.unsigned=true; return props; })(pos0, result0[3]); } @@ -10433,41 +10435,21 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 3).toLowerCase() === "not") { - result1 = input.substr(pos, 3); - pos += 3; + if (input.substr(pos, 6).toLowerCase() === "signed") { + result1 = input.substr(pos, 6); + pos += 6; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"NOT\""); + matchFailed("\"SIGNED\""); } } if (result1 !== null) { result2 = parse__(); if (result2 !== null) { - if (input.substr(pos, 4).toLowerCase() === "null") { - result3 = input.substr(pos, 4); - pos += 4; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"NULL\""); - } - } + result3 = parse_COLUMN_TYPE_PROPERTIES(); if (result3 !== null) { - result4 = parse__(); - if (result4 !== null) { - result5 = parse_COLUMN_TYPE_PROPERTIES(); - if (result5 !== null) { - result0 = [result0, result1, result2, result3, result4, result5]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3]; } else { result0 = null; pos = pos1; @@ -10486,11 +10468,9 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - if(typeof props.notNull !== 'undefined') - throw new Error('NULL or NOT NULL?'); - props.notNull=true; - return props; - })(pos0, result0[5]); + props.signed=true; + return props; + })(pos0, result0[3]); } if (result0 === null) { pos = pos0; @@ -10500,19 +10480,45 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "null") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 3).toLowerCase() === "not") { + result1 = input.substr(pos, 3); + pos += 3; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"NULL\""); + matchFailed("\"NOT\""); } } if (result1 !== null) { - result2 = parse_COLUMN_TYPE_PROPERTIES(); + result2 = parse__(); if (result2 !== null) { - result0 = [result0, result1, result2]; + if (input.substr(pos, 4).toLowerCase() === "null") { + result3 = input.substr(pos, 4); + pos += 4; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"NULL\""); + } + } + if (result3 !== null) { + result4 = parse__(); + if (result4 !== null) { + result5 = parse_COLUMN_TYPE_PROPERTIES(); + if (result5 !== null) { + result0 = [result0, result1, result2, result3, result4, result5]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10529,9 +10535,9 @@ module.exports = (function(){ result0 = (function(offset, props) { if(typeof props.notNull !== 'undefined') throw new Error('NULL or NOT NULL?'); - props.notNull=false; + props.notNull=true; return props; - })(pos0, result0[2]); + })(pos0, result0[5]); } if (result0 === null) { pos = pos0; @@ -10541,53 +10547,19 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "primary") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 4).toLowerCase() === "null") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"PRIMARY\""); + matchFailed("\"NULL\""); } } if (result1 !== null) { - pos2 = pos; - result2 = parse__(); + result2 = parse_COLUMN_TYPE_PROPERTIES(); if (result2 !== null) { - if (input.substr(pos, 3).toLowerCase() === "key") { - result3 = input.substr(pos, 3); - pos += 3; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"KEY\""); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result3 = parse__(); - if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2]; } else { result0 = null; pos = pos1; @@ -10602,9 +10574,11 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.primaryKey=true; + if(typeof props.notNull !== 'undefined') + throw new Error('NULL or NOT NULL?'); + props.notNull=false; return props; - })(pos0, result0[4]); + })(pos0, result0[2]); } if (result0 === null) { pos = pos0; @@ -10614,24 +10588,37 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "uniq") { - result1 = input.substr(pos, 4); - pos += 4; + if (input.substr(pos, 7).toLowerCase() === "primary") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"UNIQ\""); + matchFailed("\"PRIMARY\""); } } if (result1 !== null) { - if (input.substr(pos, 2).toLowerCase() === "ue") { - result2 = input.substr(pos, 2); - pos += 2; + pos2 = pos; + result2 = parse__(); + if (result2 !== null) { + if (input.substr(pos, 3).toLowerCase() === "key") { + result3 = input.substr(pos, 3); + pos += 3; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"KEY\""); + } + } + if (result3 !== null) { + result2 = [result2, result3]; + } else { + result2 = null; + pos = pos2; + } } else { result2 = null; - if (reportFailures === 0) { - matchFailed("\"UE\""); - } + pos = pos2; } result2 = result2 !== null ? result2 : ""; if (result2 !== null) { @@ -10662,7 +10649,7 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.unique=true; + props.primaryKey=true; return props; })(pos0, result0[4]); } @@ -10674,63 +10661,32 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 4).toLowerCase() === "auto") { + if (input.substr(pos, 4).toLowerCase() === "uniq") { result1 = input.substr(pos, 4); pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"AUTO\""); + matchFailed("\"UNIQ\""); } } if (result1 !== null) { - if (input.charCodeAt(pos) === 95) { - result2 = "_"; - pos++; + if (input.substr(pos, 2).toLowerCase() === "ue") { + result2 = input.substr(pos, 2); + pos += 2; } else { result2 = null; if (reportFailures === 0) { - matchFailed("\"_\""); + matchFailed("\"UE\""); } } - if (result2 === null) { - result2 = parse__(); - } + result2 = result2 !== null ? result2 : ""; if (result2 !== null) { - if (input.substr(pos, 3).toLowerCase() === "inc") { - result3 = input.substr(pos, 3); - pos += 3; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"INC\""); - } - } + result3 = parse__(); if (result3 !== null) { - if (input.substr(pos, 6).toLowerCase() === "rement") { - result4 = input.substr(pos, 6); - pos += 6; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("\"REMENT\""); - } - } - result4 = result4 !== null ? result4 : ""; + result4 = parse_COLUMN_TYPE_PROPERTIES(); if (result4 !== null) { - result5 = parse__(); - if (result5 !== null) { - result6 = parse_COLUMN_TYPE_PROPERTIES(); - if (result6 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3, result4]; } else { result0 = null; pos = pos1; @@ -10753,9 +10709,9 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, props) { - props.autoIncrement=true; + props.unique=true; return props; - })(pos0, result0[6]); + })(pos0, result0[4]); } if (result0 === null) { pos = pos0; @@ -10765,70 +10721,49 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 6).toLowerCase() === "collat") { - result1 = input.substr(pos, 6); - pos += 6; + if (input.substr(pos, 4).toLowerCase() === "auto") { + result1 = input.substr(pos, 4); + pos += 4; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"COLLAT\""); + matchFailed("\"AUTO\""); } } if (result1 !== null) { - if (input.substr(pos, 1).toLowerCase() === "e") { - result2 = input.substr(pos, 1); + if (input.charCodeAt(pos) === 95) { + result2 = "_"; pos++; } else { result2 = null; if (reportFailures === 0) { - matchFailed("\"E\""); + matchFailed("\"_\""); } } if (result2 === null) { - if (input.substr(pos, 3).toLowerCase() === "ion") { - result2 = input.substr(pos, 3); + result2 = parse__(); + } + if (result2 !== null) { + if (input.substr(pos, 3).toLowerCase() === "inc") { + result3 = input.substr(pos, 3); pos += 3; } else { - result2 = null; + result3 = null; if (reportFailures === 0) { - matchFailed("\"ION\""); + matchFailed("\"INC\""); } } - } - if (result2 !== null) { - pos2 = pos; - result3 = parse__(); if (result3 !== null) { - if (input.charCodeAt(pos) === 61) { - result4 = "="; - pos++; + if (input.substr(pos, 6).toLowerCase() === "rement") { + result4 = input.substr(pos, 6); + pos += 6; } else { result4 = null; if (reportFailures === 0) { - matchFailed("\"=\""); - } - } - if (result4 !== null) { - result5 = parse__(); - if (result5 !== null) { - result3 = [result3, result4, result5]; - } else { - result3 = null; - pos = pos2; + matchFailed("\"REMENT\""); } - } else { - result3 = null; - pos = pos2; } - } else { - result3 = null; - pos = pos2; - } - if (result3 === null) { - result3 = parse___(); - } - if (result3 !== null) { - result4 = parse_COLLATION_NAME(); + result4 = result4 !== null ? result4 : ""; if (result4 !== null) { result5 = parse__(); if (result5 !== null) { @@ -10864,10 +10799,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, collate, props) { - props.collate = collate; + result0 = (function(offset, props) { + props.autoIncrement=true; return props; - })(pos0, result0[4], result0[6]); + })(pos0, result0[6]); } if (result0 === null) { pos = pos0; @@ -10877,23 +10812,84 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "default") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 6).toLowerCase() === "collat") { + result1 = input.substr(pos, 6); + pos += 6; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"DEFAULT\""); + matchFailed("\"COLLAT\""); } } if (result1 !== null) { - result2 = parse___(); + if (input.substr(pos, 1).toLowerCase() === "e") { + result2 = input.substr(pos, 1); + pos++; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\"E\""); + } + } + if (result2 === null) { + if (input.substr(pos, 3).toLowerCase() === "ion") { + result2 = input.substr(pos, 3); + pos += 3; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\"ION\""); + } + } + } if (result2 !== null) { - result3 = parse_CONSTANT_EXPRESSION(); + pos2 = pos; + result3 = parse__(); + if (result3 !== null) { + if (input.charCodeAt(pos) === 61) { + result4 = "="; + pos++; + } else { + result4 = null; + if (reportFailures === 0) { + matchFailed("\"=\""); + } + } + if (result4 !== null) { + result5 = parse__(); + if (result5 !== null) { + result3 = [result3, result4, result5]; + } else { + result3 = null; + pos = pos2; + } + } else { + result3 = null; + pos = pos2; + } + } else { + result3 = null; + pos = pos2; + } + if (result3 === null) { + result3 = parse___(); + } if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); + result4 = parse_COLLATION_NAME(); if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; + result5 = parse__(); + if (result5 !== null) { + result6 = parse_COLUMN_TYPE_PROPERTIES(); + if (result6 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -10915,10 +10911,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, value, props) { - props.default = value; + result0 = (function(offset, collate, props) { + props.collate = collate; return props; - })(pos0, result0[3], result0[4]); + })(pos0, result0[4], result0[6]); } if (result0 === null) { pos = pos0; @@ -10940,7 +10936,7 @@ module.exports = (function(){ if (result1 !== null) { result2 = parse___(); if (result2 !== null) { - result3 = parse_CURRENT_TIMESTAMP(); + result3 = parse_CONSTANT_EXPRESSION(); if (result3 !== null) { result4 = parse_COLUMN_TYPE_PROPERTIES(); if (result4 !== null) { @@ -10966,10 +10962,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, props) { - props.default = 'CURRENT_TIMESTAMP'; + result0 = (function(offset, value, props) { + props.default = value; return props; - })(pos0, result0[4]); + })(pos0, result0[3], result0[4]); } if (result0 === null) { pos = pos0; @@ -10979,49 +10975,23 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 2).toLowerCase() === "on") { - result1 = input.substr(pos, 2); - pos += 2; + if (input.substr(pos, 7).toLowerCase() === "default") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"ON\""); + matchFailed("\"DEFAULT\""); } } if (result1 !== null) { - result2 = parse__(); + result2 = parse___(); if (result2 !== null) { - if (input.substr(pos, 6).toLowerCase() === "update") { - result3 = input.substr(pos, 6); - pos += 6; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"UPDATE\""); - } - } + result3 = parse_CURRENT_TIMESTAMP(); if (result3 !== null) { - result4 = parse__(); + result4 = parse_COLUMN_TYPE_PROPERTIES(); if (result4 !== null) { - result5 = parse_CURRENT_TIMESTAMP(); - if (result5 !== null) { - result6 = parse__(); - if (result6 !== null) { - result7 = parse_COLUMN_TYPE_PROPERTIES(); - if (result7 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result0 = [result0, result1, result2, result3, result4]; } else { result0 = null; pos = pos1; @@ -11043,10 +11013,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, val, props) { - props.onUpdate = val; + result0 = (function(offset, props) { + props.default = 'CURRENT_TIMESTAMP'; return props; - })(pos0, result0[5], result0[7]); + })(pos0, result0[4]); } if (result0 === null) { pos = pos0; @@ -11056,53 +11026,49 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "comment") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 2).toLowerCase() === "on") { + result1 = input.substr(pos, 2); + pos += 2; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"COMMENT\""); + matchFailed("\"ON\""); } } if (result1 !== null) { - pos2 = pos; result2 = parse__(); if (result2 !== null) { - if (input.charCodeAt(pos) === 61) { - result3 = "="; - pos++; + if (input.substr(pos, 6).toLowerCase() === "update") { + result3 = input.substr(pos, 6); + pos += 6; } else { result3 = null; if (reportFailures === 0) { - matchFailed("\"=\""); + matchFailed("\"UPDATE\""); } } if (result3 !== null) { result4 = parse__(); if (result4 !== null) { - result2 = [result2, result3, result4]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - if (result2 === null) { - result2 = parse___(); - } - if (result2 !== null) { - result3 = parse_STRING(); - if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; + result5 = parse_CURRENT_TIMESTAMP(); + if (result5 !== null) { + result6 = parse__(); + if (result6 !== null) { + result7 = parse_COLUMN_TYPE_PROPERTIES(); + if (result7 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -11124,23 +11090,105 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, comment, props) { - props.comment = comment; + result0 = (function(offset, val, props) { + props.onUpdate = val; return props; - })(pos0, result0[3], result0[4]); + })(pos0, result0[5], result0[7]); } if (result0 === null) { pos = pos0; } if (result0 === null) { pos0 = pos; + pos1 = pos; result0 = parse__(); if (result0 !== null) { - result0 = (function(offset) { return {}; })(pos0); + if (input.substr(pos, 7).toLowerCase() === "comment") { + result1 = input.substr(pos, 7); + pos += 7; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("\"COMMENT\""); + } + } + if (result1 !== null) { + pos2 = pos; + result2 = parse__(); + if (result2 !== null) { + if (input.charCodeAt(pos) === 61) { + result3 = "="; + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"=\""); + } + } + if (result3 !== null) { + result4 = parse__(); + if (result4 !== null) { + result2 = [result2, result3, result4]; + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + if (result2 === null) { + result2 = parse___(); + } + if (result2 !== null) { + result3 = parse_STRING(); + if (result3 !== null) { + result4 = parse_COLUMN_TYPE_PROPERTIES(); + if (result4 !== null) { + result0 = [result0, result1, result2, result3, result4]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = (function(offset, comment, props) { + props.comment = comment; + return props; + })(pos0, result0[3], result0[4]); } if (result0 === null) { pos = pos0; } + if (result0 === null) { + pos0 = pos; + result0 = parse__(); + if (result0 !== null) { + result0 = (function(offset) { return {}; })(pos0); + } + if (result0 === null) { + pos = pos0; + } + } } } } diff --git a/tests/parser/13-01-14-create-table.js b/tests/parser/13-01-14-create-table.js index bd56d6d..47ddf32 100644 --- a/tests/parser/13-01-14-create-table.js +++ b/tests/parser/13-01-14-create-table.js @@ -279,6 +279,16 @@ exports['Grammar: CREATE TABLE: valid input'] = rule_yields.bind(null, definitions: [ { type: 'VARBINARY', name: 'name', length: 255, notNull: true }, ] }] + ], [ + 'CREATE TABLE a (flag BOOLEAN NOT NULL DEFAULT TRUE)', + [{ + statement: 'CREATE', + what: 'TABLE', + schema: undefined, + table: 'a', + definitions: [ { type: 'BOOLEAN', name: 'flag', default: true, notNull: true }, + ] + }] ] ], 'deepEqual' ); From fe1c93c149a2b81c8a7b166c3f4b05f1b15ecf82 Mon Sep 17 00:00:00 2001 From: Shigeki Morimoto Date: Fri, 29 Sep 2017 11:38:45 +0900 Subject: [PATCH 7/8] Allow lower case "EXISTS". --- grammar/13-01-14-create-table.pegjs | 2 +- lib/sqljs-parser.js | 4 ++-- tests/parser/13-01-14-create-table.js | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/grammar/13-01-14-create-table.pegjs b/grammar/13-01-14-create-table.pegjs index a83ac8e..b43d129 100644 --- a/grammar/13-01-14-create-table.pegjs +++ b/grammar/13-01-14-create-table.pegjs @@ -42,7 +42,7 @@ TABLE_PROPERTIES props.comment = comment; return props; } - / "IF"i _ "NOT"i _ "EXIST" "S"i? _ props:TABLE_PROPERTIES { + / "IF"i _ "NOT"i _ "EXIST"i "S"i? _ props:TABLE_PROPERTIES { props.ifNotExists = true; return props; } diff --git a/lib/sqljs-parser.js b/lib/sqljs-parser.js index 48c56dc..19bc91e 100644 --- a/lib/sqljs-parser.js +++ b/lib/sqljs-parser.js @@ -7119,8 +7119,8 @@ module.exports = (function(){ if (result2 !== null) { result3 = parse__(); if (result3 !== null) { - if (input.substr(pos, 5) === "EXIST") { - result4 = "EXIST"; + if (input.substr(pos, 5).toLowerCase() === "exist") { + result4 = input.substr(pos, 5); pos += 5; } else { result4 = null; diff --git a/tests/parser/13-01-14-create-table.js b/tests/parser/13-01-14-create-table.js index 47ddf32..588cc73 100644 --- a/tests/parser/13-01-14-create-table.js +++ b/tests/parser/13-01-14-create-table.js @@ -289,6 +289,17 @@ exports['Grammar: CREATE TABLE: valid input'] = rule_yields.bind(null, definitions: [ { type: 'BOOLEAN', name: 'flag', default: true, notNull: true }, ] }] + ], [ + 'create table a if not exists (id number)', + [{ + statement: 'CREATE', + what: 'TABLE', + schema: undefined, + table: 'a', + ifNotExists: true, + definitions: [ { type: 'DECIMAL', name: 'id' }, + ] + }] ] ], 'deepEqual' ); From 7496cc2922434b13e6b56bb1451c11c84fdea2ed Mon Sep 17 00:00:00 2001 From: Shigeki Morimoto Date: Fri, 29 Sep 2017 15:13:32 +0900 Subject: [PATCH 8/8] Allow 'DEFAULT NOW()'. --- grammar/13-01-14-create-table.pegjs | 7 +- lib/sqljs-parser.js | 199 ++++++++++---------------- tests/parser/13-01-14-create-table.js | 9 ++ 3 files changed, 87 insertions(+), 128 deletions(-) diff --git a/grammar/13-01-14-create-table.pegjs b/grammar/13-01-14-create-table.pegjs index b43d129..5207d7c 100644 --- a/grammar/13-01-14-create-table.pegjs +++ b/grammar/13-01-14-create-table.pegjs @@ -324,13 +324,12 @@ COLUMN_TYPE_PROPERTIES "Column type properties" return props; } / _ "DEFAULT"i __ value:CONSTANT_EXPRESSION props:COLUMN_TYPE_PROPERTIES { + if (value.toSql) { // @@@ FIXME. much ad-hock + value = value.toSql() + } props.default = value; return props; } - / _ "DEFAULT"i __ CURRENT_TIMESTAMP props:COLUMN_TYPE_PROPERTIES { - props.default = 'CURRENT_TIMESTAMP'; - return props; - } / _ "ON"i _ "UPDATE"i _ val:CURRENT_TIMESTAMP _ props:COLUMN_TYPE_PROPERTIES { props.onUpdate = val; return props; diff --git a/lib/sqljs-parser.js b/lib/sqljs-parser.js index 19bc91e..c914021 100644 --- a/lib/sqljs-parser.js +++ b/lib/sqljs-parser.js @@ -10963,6 +10963,9 @@ module.exports = (function(){ } if (result0 !== null) { result0 = (function(offset, value, props) { + if (value.toSql) { + value = value.toSql() + } props.default = value; return props; })(pos0, result0[3], result0[4]); @@ -10975,23 +10978,49 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "default") { - result1 = input.substr(pos, 7); - pos += 7; + if (input.substr(pos, 2).toLowerCase() === "on") { + result1 = input.substr(pos, 2); + pos += 2; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"DEFAULT\""); + matchFailed("\"ON\""); } } if (result1 !== null) { - result2 = parse___(); + result2 = parse__(); if (result2 !== null) { - result3 = parse_CURRENT_TIMESTAMP(); + if (input.substr(pos, 6).toLowerCase() === "update") { + result3 = input.substr(pos, 6); + pos += 6; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("\"UPDATE\""); + } + } if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); + result4 = parse__(); if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; + result5 = parse_CURRENT_TIMESTAMP(); + if (result5 !== null) { + result6 = parse__(); + if (result6 !== null) { + result7 = parse_COLUMN_TYPE_PROPERTIES(); + if (result7 !== null) { + result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } } else { result0 = null; pos = pos1; @@ -11013,10 +11042,10 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, props) { - props.default = 'CURRENT_TIMESTAMP'; + result0 = (function(offset, val, props) { + props.onUpdate = val; return props; - })(pos0, result0[4]); + })(pos0, result0[5], result0[7]); } if (result0 === null) { pos = pos0; @@ -11026,49 +11055,53 @@ module.exports = (function(){ pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 2).toLowerCase() === "on") { - result1 = input.substr(pos, 2); - pos += 2; + if (input.substr(pos, 7).toLowerCase() === "comment") { + result1 = input.substr(pos, 7); + pos += 7; } else { result1 = null; if (reportFailures === 0) { - matchFailed("\"ON\""); + matchFailed("\"COMMENT\""); } } if (result1 !== null) { + pos2 = pos; result2 = parse__(); if (result2 !== null) { - if (input.substr(pos, 6).toLowerCase() === "update") { - result3 = input.substr(pos, 6); - pos += 6; + if (input.charCodeAt(pos) === 61) { + result3 = "="; + pos++; } else { result3 = null; if (reportFailures === 0) { - matchFailed("\"UPDATE\""); + matchFailed("\"=\""); } } if (result3 !== null) { result4 = parse__(); if (result4 !== null) { - result5 = parse_CURRENT_TIMESTAMP(); - if (result5 !== null) { - result6 = parse__(); - if (result6 !== null) { - result7 = parse_COLUMN_TYPE_PROPERTIES(); - if (result7 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6, result7]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } + result2 = [result2, result3, result4]; + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + if (result2 === null) { + result2 = parse___(); + } + if (result2 !== null) { + result3 = parse_STRING(); + if (result3 !== null) { + result4 = parse_COLUMN_TYPE_PROPERTIES(); + if (result4 !== null) { + result0 = [result0, result1, result2, result3, result4]; } else { result0 = null; pos = pos1; @@ -11090,105 +11123,23 @@ module.exports = (function(){ pos = pos1; } if (result0 !== null) { - result0 = (function(offset, val, props) { - props.onUpdate = val; + result0 = (function(offset, comment, props) { + props.comment = comment; return props; - })(pos0, result0[5], result0[7]); + })(pos0, result0[3], result0[4]); } if (result0 === null) { pos = pos0; } if (result0 === null) { pos0 = pos; - pos1 = pos; result0 = parse__(); if (result0 !== null) { - if (input.substr(pos, 7).toLowerCase() === "comment") { - result1 = input.substr(pos, 7); - pos += 7; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"COMMENT\""); - } - } - if (result1 !== null) { - pos2 = pos; - result2 = parse__(); - if (result2 !== null) { - if (input.charCodeAt(pos) === 61) { - result3 = "="; - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"=\""); - } - } - if (result3 !== null) { - result4 = parse__(); - if (result4 !== null) { - result2 = [result2, result3, result4]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - if (result2 === null) { - result2 = parse___(); - } - if (result2 !== null) { - result3 = parse_STRING(); - if (result3 !== null) { - result4 = parse_COLUMN_TYPE_PROPERTIES(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, comment, props) { - props.comment = comment; - return props; - })(pos0, result0[3], result0[4]); + result0 = (function(offset) { return {}; })(pos0); } if (result0 === null) { pos = pos0; } - if (result0 === null) { - pos0 = pos; - result0 = parse__(); - if (result0 !== null) { - result0 = (function(offset) { return {}; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - } } } } diff --git a/tests/parser/13-01-14-create-table.js b/tests/parser/13-01-14-create-table.js index 588cc73..8bbbafa 100644 --- a/tests/parser/13-01-14-create-table.js +++ b/tests/parser/13-01-14-create-table.js @@ -300,6 +300,15 @@ exports['Grammar: CREATE TABLE: valid input'] = rule_yields.bind(null, definitions: [ { type: 'DECIMAL', name: 'id' }, ] }] + ], [ + 'create table a (d TIMESTAMP DEFAULT now())', + [{ + statement: 'CREATE', + what: 'TABLE', + schema: undefined, + table: 'a', + definitions: [ { type: 'TIMESTAMP', name: 'd', default: 'CURRENT_TIMESTAMP' }, ] + }] ] ], 'deepEqual' );