diff --git a/dist/deparser.js b/dist/deparser.js index 4c878d1..1d90922 100644 --- a/dist/deparser.js +++ b/dist/deparser.js @@ -14,6 +14,8 @@ var _util = require('util'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const CONSTRAINT_TYPES = ['NULL', 'NOT NULL', 'DEFAULT', 'CHECK', 'PRIMARY KEY', 'UNIQUE', 'EXCLUDE', 'REFERENCES']; + const keys = _lodash2.default.keys; @@ -36,7 +38,7 @@ const parens = string => { }; const indent = function indent(text) { - let count = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; + let count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; return text; }; @@ -58,7 +60,7 @@ class Deparser { } list(nodes) { - let separator = arguments.length <= 1 || arguments[1] === undefined ? ', ' : arguments[1]; + let separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ', '; if (!nodes) { return ''; @@ -132,12 +134,11 @@ class Deparser { } type(names, args) { - var _names$map = names.map(name => this.deparse(name)); - - var _names$map2 = _slicedToArray(_names$map, 2); + var _names$map = names.map(name => this.deparse(name)), + _names$map2 = _slicedToArray(_names$map, 2); - const catalog = _names$map2[0]; - const type = _names$map2[1]; + const catalog = _names$map2[0], + type = _names$map2[1]; const mods = (name, size) => { @@ -194,7 +195,7 @@ class Deparser { if (node.name.length > 1) { const schema = this.deparse(node.name[0]); const operator = this.deparse(node.name[1]); - output.push(`OPERATOR(${ schema }.${ operator })`); + output.push(`OPERATOR(${schema}.${operator})`); } else { output.push(this.deparse(node.name[0])); } @@ -213,13 +214,13 @@ class Deparser { // AEXPR_OP_ANY output.push(this.deparse(node.lexpr)); output.push((0, _util.format)('ANY (%s)', this.deparse(node.rexpr))); - return output.join(` ${ this.deparse(node.name[0]) } `); + return output.join(` ${this.deparse(node.name[0])} `); case 2: // AEXPR_OP_ALL output.push(this.deparse(node.lexpr)); output.push((0, _util.format)('ALL (%s)', this.deparse(node.rexpr))); - return output.join(` ${ this.deparse(node.name[0]) } `); + return output.join(` ${this.deparse(node.name[0])} `); case 3: // AEXPR_DISTINCT @@ -333,7 +334,7 @@ class Deparser { } ['A_Indirection'](node) { - const output = [`(${ this.deparse(node.arg) })`]; + const output = [`(${this.deparse(node.arg)})`]; // TODO(zhm) figure out the actual rules for when a '.' is needed // @@ -348,7 +349,7 @@ class Deparser { if (subnode.String || subnode.A_Star) { const value = subnode.A_Star ? '*' : this.quote(subnode.String.str); - output.push(`.${ value }`); + output.push(`.${value}`); } else { output.push(this.deparse(subnode)); } @@ -363,7 +364,7 @@ class Deparser { ['BitString'](node) { const prefix = node.str[0]; - return `${ prefix }'${ node.str.substring(1) }'`; + return `${prefix}'${node.str.substring(1)}'`; } ['BoolExpr'](node) { @@ -478,7 +479,7 @@ class Deparser { ['Float'](node) { // wrap negative numbers in parens, SELECT (-2147483648)::int4 * (-1)::int4 if (node.str[0] === '-') { - return `(${ node.str })`; + return `(${node.str})`; } return node.str; @@ -585,7 +586,7 @@ class Deparser { ['Integer'](node) { if (node.ival < 0) { - return `(${ node.ival })`; + return `(${node.ival})`; } return node.ival.toString(); @@ -642,20 +643,20 @@ class Deparser { // wrap nested join expressions in parens to make the following symmetric: // select * from int8_tbl x cross join (int4_tbl x cross join lateral (select x.f1) ss) if (node.rarg.JoinExpr != null && !(node.rarg.JoinExpr.alias != null)) { - output.push(`(${ this.deparse(node.rarg) })`); + output.push(`(${this.deparse(node.rarg)})`); } else { output.push(this.deparse(node.rarg)); } } if (node.quals) { - output.push(`ON ${ this.deparse(node.quals) }`); + output.push(`ON ${this.deparse(node.quals)}`); } if (node.usingClause) { const using = this.quote(this.deparseNodes(node.usingClause)).join(', '); - output.push(`USING (${ using })`); + output.push(`USING (${using})`); } const wrapped = node.rarg.JoinExpr != null || node.alias ? '(' + output.join(' ') + ')' : output.join(' '); @@ -753,7 +754,7 @@ class Deparser { const calls = funcs.join(', '); if (node.is_rowsfrom) { - output.push(`ROWS FROM (${ calls })`); + output.push(`ROWS FROM (${calls})`); } else { output.push(calls); } @@ -770,9 +771,9 @@ class Deparser { const defList = this.list(node.coldeflist); if (!node.alias) { - output.push(` AS (${ defList })`); + output.push(` AS (${defList})`); } else { - output.push(`(${ defList })`); + output.push(`(${defList})`); } } @@ -894,7 +895,7 @@ class Deparser { const clause = node.distinctClause.map(e => this.deparse(e, 'select')).join(',\n'); - output.push(`(${ clause })`); + output.push(`(${clause})`); } else { output.push('DISTINCT'); } @@ -923,7 +924,7 @@ class Deparser { output.push('VALUES'); const lists = node.valuesLists.map(list => { - return `(${ list.map(v => this.deparse(v)).join(', ') })`; + return `(${list.map(v => this.deparse(v)).join(', ')})`; }); output.push(lists.join(', ')); @@ -984,6 +985,242 @@ class Deparser { return output.join(' '); } + ['CreateStmt'](node) { + const output = []; + output.push('CREATE TABLE'); + output.push(this.deparse(node.relation)); + output.push('('); + output.push(this.list(node.tableElts)); + output.push(')'); + output.push(';'); + return output.join(' '); + } + + ['ConstraintStmt'](node) { + const output = []; + const constraint = CONSTRAINT_TYPES[node.contype]; + + if (node.conname) { + output.push(`CONSTRAINT ${node.conname} ${constraint}`); + } else { + output.push(constraint); + } + + return output.join(' '); + } + + ['ReferenceConstraint'](node) { + const output = []; + if (node.pk_attrs && node.fk_attrs) { + output.push('FOREIGN KEY'); + output.push('('); + output.push(this.list(node.fk_attrs)); + output.push(')'); + output.push('REFERENCES'); + output.push(this.deparse(node.pktable)); + output.push('('); + output.push(this.list(node.pk_attrs)); + output.push(')'); + } else if (node.pk_attrs) { + output.push(this.ConstraintStmt(node)); + output.push(this.deparse(node.pktable)); + output.push('('); + output.push(this.list(node.pk_attrs)); + output.push(')'); + } else { + output.push(this.ConstraintStmt(node)); + output.push(this.deparse(node.pktable)); + } + return output.join(' '); + } + + ['ExclusionConstraint'](node) { + const output = []; + function getExclusionGroup(node) { + var output = []; + var a = node.exclusions.map(excl => { + if (excl[0].IndexElem.name) { + return excl[0].IndexElem.name; + } else if (excl[0].IndexElem.expr) { + return this.deparse(excl[0].IndexElem.expr); + } + }); + + var b = node.exclusions.map(excl => this.deparse(excl[1][0])); + + for (var i = 0; i < a.length; i++) { + output.push(`${a[i]} WITH ${b[i]}`); + i !== a.length - 1 && output.push(','); + } + + return output.join(' '); + } + + if (node.exclusions && node.access_method) { + output.push('USING'); + output.push(node.access_method); + output.push('('); + output.push(getExclusionGroup.call(this, node)); + output.push(')'); + } + + return output.join(' '); + } + + ['Constraint'](node) { + const output = []; + + const constraint = CONSTRAINT_TYPES[node.contype]; + if (!constraint) { + throw new Error('type not implemented: ' + node.contype); + } + + if (constraint === 'REFERENCES') { + output.push(this.ReferenceConstraint(node)); + } else { + output.push(this.ConstraintStmt(node)); + } + + if (node.keys) { + output.push('('); + output.push(this.list(node.keys)); + output.push(')'); + } + + if (node.raw_expr) { + output.push(this.deparse(node.raw_expr)); + } + + if (node.fk_del_action) { + switch (node.fk_del_action) { + case 'r': + output.push('ON DELETE RESTRICT'); + break; + case 'c': + output.push('ON DELETE CASCADE'); + break; + default: + } + } + + if (node.fk_upd_action) { + switch (node.fk_upd_action) { + case 'r': + output.push('ON UPDATE RESTRICT'); + break; + case 'c': + output.push('ON UPDATE CASCADE'); + break; + default: + } + } + + if (constraint === 'EXCLUDE') { + output.push(this.ExclusionConstraint(node)); + } + + return output.join(' '); + } + + ['FunctionParameter'](node) { + const output = []; + + output.push(node.name); + output.push(this.deparse(node.argType)); + + return output.join(' '); + } + + ['CreateFunctionStmt'](node) { + const output = []; + + output.push('CREATE'); + if (node.replace) { + output.push('OR REPLACE'); + } + output.push('FUNCTION'); + + output.push(node.funcname.map(name => this.deparse(name)).join('.')); + output.push('('); + output.push(node.parameters.filter((_ref) => { + let FunctionParameter = _ref.FunctionParameter; + return FunctionParameter.mode === 105; + }).map(param => this.deparse(param)).join(', ')); + output.push(')'); + + var returns = node.parameters.filter((_ref2) => { + let FunctionParameter = _ref2.FunctionParameter; + return FunctionParameter.mode === 116; + }); + // var setof = node.parameters.filter( + // ({ FunctionParameter }) => FunctionParameter.mode === 109 + // ); + + output.push('RETURNS'); + if (returns.length) { + output.push('TABLE'); + output.push('('); + output.push(node.parameters.filter((_ref3) => { + let FunctionParameter = _ref3.FunctionParameter; + return FunctionParameter.mode === 116; + }).map(param => this.deparse(param)).join(', ')); + output.push(')'); + } else { + output.push(this.deparse(node.returnType)); + } + + var elems = {}; + + node.options.forEach(option => { + if (option && option.DefElem) { + switch (option.DefElem.defname) { + case 'as': + elems.as = option; + break; + + case 'language': + elems.language = option; + break; + + case 'volatility': + elems.volatility = option; + break; + } + } + }); + + output.push(` +AS $$${this.deparse(elems.as.DefElem.arg[0])}$$ +LANGUAGE '${this.deparse(elems.language.DefElem.arg)}' ${this.deparse(elems.volatility.DefElem.arg).toUpperCase()}; +`); + + return output.join(' '); + } + ['CreateSchemaStmt'](node) { + const output = []; + + output.push('CREATE'); + if (node.replace) { + output.push('OR REPLACE'); + } + output.push('SCHEMA'); + output.push(node.schemaname); + return output.join(' '); + } + + ['TransactionStmt'](node) { + switch (node.kind) { + case 0: + return 'BEGIN'; + break; + case 1: + break; + case 2: + return 'COMMIT'; + default: + } + } + ['SortBy'](node) { const output = []; @@ -998,7 +1235,7 @@ class Deparser { } if (node.sortby_dir === 3) { - output.push(`USING ${ this.deparseNodes(node.useOp) }`); + output.push(`USING ${this.deparseNodes(node.useOp)}`); } if (node.sortby_nulls === 1) { @@ -1257,7 +1494,7 @@ class Deparser { // SELECT interval(0) '1 day 01:23:45.6789' if (node.typmods[0] && node.typmods[0].A_Const && node.typmods[0].A_Const.val.Integer.ival === 32767 && node.typmods[1] && node.typmods[1].A_Const != null) { - intervals = [`(${ node.typmods[1].A_Const.val.Integer.ival })`]; + intervals = [`(${node.typmods[1].A_Const.val.Integer.ival})`]; } else { intervals = intervals.map(part => { if (part === 'second' && typmods.length === 2) { diff --git a/dist/deparser.js.map b/dist/deparser.js.map index 40b82af..605ea9d 100644 --- a/dist/deparser.js.map +++ b/dist/deparser.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/deparser.js"],"names":[],"mappings":"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","file":"deparser.js","sourcesContent":["import _ from 'lodash';\nimport { format } from 'util';\n\nconst { keys } = _;\n\nconst compact = o => {\n return _.filter(_.compact(o), (p) => {\n if (p == null) {\n return false;\n }\n\n return p.toString().length;\n });\n};\n\nconst fail = (type, node) => {\n throw new Error(format('Unhandled %s node: %s', type, JSON.stringify(node)));\n};\n\nconst parens = (string) => {\n return '(' + string + ')';\n};\n\nconst indent = (text, count = 1) => text;\n\nexport default class Deparser {\n static deparse(query) {\n return new Deparser(query).deparseQuery();\n }\n\n constructor(tree) {\n this.tree = tree;\n }\n\n deparseQuery() {\n return (this.tree.map(node => this.deparse(node))).join('\\n\\n');\n }\n\n deparseNodes(nodes) {\n return nodes.map(node => this.deparse(node));\n }\n\n list(nodes, separator = ', ') {\n if (!nodes) {\n return '';\n }\n\n return this.deparseNodes(nodes).join(separator);\n }\n\n quote(value) {\n if (value == null) {\n return null;\n }\n\n if (_.isArray(value)) {\n return value.map(o => this.quote(o));\n }\n\n return '\"' + value + '\"';\n }\n\n // SELECT encode(E'''123\\\\000\\\\001', 'base64')\n escape(literal) {\n return \"'\" + literal.replace(/'/g, \"''\") + \"'\";\n }\n\n convertTypeName(typeName, size) {\n switch (typeName) {\n case 'bpchar':\n if (size != null) {\n return 'char';\n }\n // return `pg_catalog.bpchar` below so that the following is symmetric\n // SELECT char 'c' = char 'c' AS true\n return 'pg_catalog.bpchar';\n case 'varchar':\n return 'varchar';\n case 'numeric':\n return 'numeric';\n case 'bool':\n return 'boolean';\n case 'int2':\n return 'smallint';\n case 'int4':\n return 'int';\n case 'int8':\n return 'bigint';\n case 'real': case 'float4':\n return 'real';\n case 'float8':\n return 'pg_catalog.float8';\n case 'text':\n // SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True\n return 'pg_catalog.text';\n case 'date':\n return 'pg_catalog.date';\n case 'time':\n return 'time';\n case 'timetz':\n return 'pg_catalog.timetz';\n case 'timestamp':\n return 'timestamp';\n case 'timestamptz':\n return 'pg_catalog.timestamptz';\n case 'interval':\n return 'interval';\n case 'bit':\n return 'bit';\n default:\n throw new Error(format('Unhandled data type: %s', typeName));\n }\n }\n\n type(names, args) {\n const [ catalog, type ] = names.map(name => this.deparse(name));\n\n const mods = (name, size) => {\n if (size != null) {\n return name + '(' + size + ')';\n }\n\n return name;\n };\n\n // handle the special \"char\" (in quotes) type\n if (names[0].String.str === 'char') {\n names[0].String.str = '\"char\"';\n }\n\n if (catalog !== 'pg_catalog') {\n return mods(this.list(names, '.'), args);\n }\n\n const res = this.convertTypeName(type, args);\n\n return mods(res, args);\n }\n\n deparse(item, context) {\n if (item == null) {\n return null;\n }\n\n if (_.isNumber(item)) {\n return item;\n }\n\n const type = keys(item)[0];\n const node = _.values(item)[0];\n\n if (this[type] == null) {\n throw new Error(type + ' is not implemented');\n }\n\n return this[type](node, context);\n }\n\n ['A_Expr'](node, context) {\n const output = [];\n\n switch (node.kind) {\n case 0: // AEXPR_OP\n if (node.lexpr) {\n output.push(parens(this.deparse(node.lexpr)));\n }\n\n if (node.name.length > 1) {\n const schema = this.deparse(node.name[0]);\n const operator = this.deparse(node.name[1]);\n output.push(`OPERATOR(${schema}.${operator})`);\n } else {\n output.push(this.deparse(node.name[0]));\n }\n\n if (node.rexpr) {\n output.push(parens(this.deparse(node.rexpr)));\n }\n\n if (output.length === 2) {\n return parens(output.join(''));\n }\n\n return parens(output.join(' '));\n\n case 1: // AEXPR_OP_ANY\n output.push(this.deparse(node.lexpr));\n output.push(format('ANY (%s)', this.deparse(node.rexpr)));\n return output.join(` ${this.deparse(node.name[0])} `);\n\n case 2: // AEXPR_OP_ALL\n output.push(this.deparse(node.lexpr));\n output.push(format('ALL (%s)', this.deparse(node.rexpr)));\n return output.join(` ${this.deparse(node.name[0])} `);\n\n case 3: // AEXPR_DISTINCT\n return format('%s IS DISTINCT FROM %s', this.deparse(node.lexpr), this.deparse(node.rexpr));\n\n case 4: // AEXPR_NULLIF\n return format('NULLIF(%s, %s)', this.deparse(node.lexpr), this.deparse(node.rexpr));\n\n case 5: { // AEXPR_OF\n const op = node.name[0].String.str === '=' ? 'IS OF' : 'IS NOT OF';\n return format('%s %s (%s)', this.deparse(node.lexpr), op, this.list(node.rexpr));\n }\n\n case 6: { // AEXPR_IN\n const operator = node.name[0].String.str === '=' ? 'IN' : 'NOT IN';\n\n return format('%s %s (%s)', this.deparse(node.lexpr), operator, this.list(node.rexpr));\n }\n\n case 7: // AEXPR_LIKE\n output.push(this.deparse(node.lexpr));\n\n if (node.name[0].String.str === '!~~') {\n output.push(format('NOT LIKE (%s)', this.deparse(node.rexpr)));\n } else {\n output.push(format('LIKE (%s)', this.deparse(node.rexpr)));\n }\n\n return output.join(' ');\n\n case 8: // AEXPR_ILIKE\n output.push(this.deparse(node.lexpr));\n\n if (node.name[0].String.str === '!~~*') {\n output.push(format('NOT ILIKE (%s)', this.deparse(node.rexpr)));\n } else {\n output.push(format('ILIKE (%s)', this.deparse(node.rexpr)));\n }\n\n return output.join(' ');\n\n case 9: // AEXPR_SIMILAR\n // SIMILAR TO emits a similar_escape FuncCall node with the first argument\n output.push(this.deparse(node.lexpr));\n\n if (this.deparse(node.rexpr.FuncCall.args[1].Null)) {\n output.push(format('SIMILAR TO %s', this.deparse(node.rexpr.FuncCall.args[0])));\n } else {\n output.push(format('SIMILAR TO %s ESCAPE %s',\n this.deparse(node.rexpr.FuncCall.args[0]),\n this.deparse(node.rexpr.FuncCall.args[1])));\n }\n\n return output.join(' ');\n\n case 10: // AEXPR_BETWEEN TODO(zhm) untested\n output.push(this.deparse(node.lexpr));\n output.push(format('BETWEEN %s AND %s', this.deparse(node.rexpr[0]), this.deparse(node.rexpr[1])));\n return output.join(' ');\n\n case 11: // AEXPR_NOT_BETWEEN TODO(zhm) untested\n output.push(this.deparse(node.lexpr));\n output.push(format('NOT BETWEEN %s AND %s', this.deparse(node.rexpr[0]), this.deparse(node.rexpr[1])));\n return output.join(' ');\n\n default:\n return fail('A_Expr', node);\n }\n }\n\n ['Alias'](node, context) {\n const name = node.aliasname;\n\n const output = [ 'AS' ];\n\n if (node.colnames) {\n output.push(name + parens(this.list(node.colnames)));\n } else {\n output.push(this.quote(name));\n }\n\n return output.join(' ');\n }\n\n ['A_ArrayExpr'](node) {\n return format('ARRAY[%s]', this.list(node.elements));\n }\n\n ['A_Const'](node, context) {\n if (node.val.String) {\n return this.escape(this.deparse(node.val));\n }\n\n return this.deparse(node.val);\n }\n\n ['A_Indices'](node) {\n if (node.lidx) {\n return format('[%s:%s]', this.deparse(node.lidx), this.deparse(node.uidx));\n }\n\n return format('[%s]', this.deparse(node.uidx));\n }\n\n ['A_Indirection'](node) {\n const output = [ `(${this.deparse(node.arg)})` ];\n\n // TODO(zhm) figure out the actual rules for when a '.' is needed\n //\n // select a.b[0] from a;\n // select (select row(1)).*\n // select c2[2].f2 from comptable\n // select c2.a[2].f2[1].f3[0].a1 from comptable\n\n for (let i = 0; i < node.indirection.length; i++) {\n const subnode = node.indirection[i];\n\n if (subnode.String || subnode.A_Star) {\n const value = subnode.A_Star ? '*' : this.quote(subnode.String.str);\n\n output.push(`.${value}`);\n } else {\n output.push(this.deparse(subnode));\n }\n }\n\n return output.join('');\n }\n\n ['A_Star'](node, context) {\n return '*';\n }\n\n ['BitString'](node) {\n const prefix = node.str[0];\n return `${prefix}'${node.str.substring(1)}'`;\n }\n\n ['BoolExpr'](node) {\n switch (node.boolop) {\n case 0:\n return parens(this.list(node.args, ' AND '));\n case 1:\n return parens(this.list(node.args, ' OR '));\n case 2:\n return format('NOT (%s)', this.deparse(node.args[0]));\n default:\n return fail('BoolExpr', node);\n }\n }\n\n ['BooleanTest'](node) {\n const output = [];\n\n output.push(this.deparse(node.arg));\n\n const tests = [\n 'IS TRUE',\n 'IS NOT TRUE',\n 'IS FALSE',\n 'IS NOT FALSE',\n 'IS UNKNOWN',\n 'IS NOT UNKNOWN'\n ];\n\n output.push(tests[node.booltesttype]);\n\n return output.join(' ');\n }\n\n ['CaseExpr'](node) {\n const output = [ 'CASE' ];\n\n if (node.arg) {\n output.push(this.deparse(node.arg));\n }\n\n for (let i = 0; i < node.args.length; i++) {\n output.push(this.deparse(node.args[i]));\n }\n\n if (node.defresult) {\n output.push('ELSE');\n output.push(this.deparse(node.defresult));\n }\n\n output.push('END');\n\n return output.join(' ');\n }\n\n ['CoalesceExpr'](node) {\n return format('COALESCE(%s)', this.list(node.args));\n }\n\n ['CollateClause'](node) {\n const output = [];\n\n if (node.arg) {\n output.push(this.deparse(node.arg));\n }\n\n output.push('COLLATE');\n\n if (node.collname) {\n output.push(this.quote(this.deparseNodes(node.collname)));\n }\n\n return output.join(' ');\n }\n\n ['ColumnDef'](node) {\n const output = [ this.quote(node.colname) ];\n\n output.push(this.deparse(node.typeName));\n\n if (node.raw_default) {\n output.push('USING');\n output.push(this.deparse(node.raw_default));\n }\n\n if (node.constraints) {\n output.push(this.list(node.constraints, ' '));\n }\n\n return _.compact(output).join(' ');\n }\n\n ['ColumnRef'](node) {\n const fields = node.fields.map(field => {\n if (field.String) {\n return this.quote(this.deparse(field));\n }\n\n return this.deparse(field);\n });\n\n return fields.join('.');\n }\n\n ['CommonTableExpr'](node) {\n const output = [];\n\n output.push(node.ctename);\n\n if (node.aliascolnames) {\n output.push(format('(%s)', this.quote(this.deparseNodes(node.aliascolnames))));\n }\n\n output.push(format('AS (%s)', this.deparse(node.ctequery)));\n\n return output.join(' ');\n }\n\n ['Float'](node) {\n // wrap negative numbers in parens, SELECT (-2147483648)::int4 * (-1)::int4\n if (node.str[0] === '-') {\n return `(${node.str})`;\n }\n\n return node.str;\n }\n\n ['FuncCall'](node, context) {\n const output = [];\n\n let params = [];\n\n if (node.args) {\n params = node.args.map(item => {\n return this.deparse(item);\n });\n }\n\n // COUNT(*)\n if (node.agg_star) {\n params.push('*');\n }\n\n const name = this.list(node.funcname, '.');\n\n const order = [];\n\n const withinGroup = node.agg_within_group;\n\n if (node.agg_order) {\n order.push('ORDER BY');\n order.push(this.list(node.agg_order, ', '));\n }\n\n const call = [];\n\n call.push(name + '(');\n\n if (node.agg_distinct) {\n call.push('DISTINCT ');\n }\n\n // prepend variadic before the last parameter\n // SELECT CONCAT('|', VARIADIC ARRAY['1','2','3'])\n if (node.func_variadic) {\n params[params.length - 1] = 'VARIADIC ' + params[params.length - 1];\n }\n\n call.push(params.join(', '));\n\n if (order.length && !withinGroup) {\n call.push(' ');\n call.push(order.join(' '));\n }\n\n call.push(')');\n\n output.push(compact(call).join(''));\n\n if (order.length && withinGroup) {\n output.push('WITHIN GROUP');\n output.push(parens(order.join(' ')));\n }\n\n if (node.agg_filter != null) {\n output.push(format('FILTER (WHERE %s)', this.deparse(node.agg_filter)));\n }\n\n if (node.over != null) {\n output.push(format('OVER %s', this.deparse(node.over)));\n }\n\n return output.join(' ');\n }\n\n ['GroupingFunc'](node) {\n return 'GROUPING(' + this.list(node.args) + ')';\n }\n\n ['GroupingSet'](node) {\n switch (node.kind) {\n case 0: // GROUPING_SET_EMPTY\n return '()';\n\n case 1: // GROUPING_SET_SIMPLE\n return fail('GroupingSet', node);\n\n case 2: // GROUPING_SET_ROLLUP\n return 'ROLLUP (' + this.list(node.content) + ')';\n\n case 3: // GROUPING_SET_CUBE\n return 'CUBE (' + this.list(node.content) + ')';\n\n case 4: // GROUPING_SET_SETS\n return 'GROUPING SETS (' + this.list(node.content) + ')';\n\n default:\n return fail('GroupingSet', node);\n }\n }\n\n ['Integer'](node) {\n if (node.ival < 0) {\n return `(${node.ival})`;\n }\n\n return node.ival.toString();\n }\n\n ['IntoClause'](node) {\n return this.deparse(node.rel);\n }\n\n ['JoinExpr'](node, context) {\n const output = [];\n\n output.push(this.deparse(node.larg));\n\n if (node.isNatural) {\n output.push('NATURAL');\n }\n\n let join = null;\n\n switch (true) {\n case node.jointype === 0 && (node.quals != null):\n join = 'INNER JOIN';\n break;\n\n case node.jointype === 0 && !node.isNatural && !(node.quals != null) && !(node.usingClause != null):\n join = 'CROSS JOIN';\n break;\n\n case node.jointype === 0:\n join = 'JOIN';\n break;\n\n case node.jointype === 1:\n join = 'LEFT OUTER JOIN';\n break;\n\n case node.jointype === 2:\n join = 'FULL OUTER JOIN';\n break;\n\n case node.jointype === 3:\n join = 'RIGHT OUTER JOIN';\n break;\n\n default:\n fail('JoinExpr', node);\n break;\n }\n\n output.push(join);\n\n if (node.rarg) {\n // wrap nested join expressions in parens to make the following symmetric:\n // select * from int8_tbl x cross join (int4_tbl x cross join lateral (select x.f1) ss)\n if ((node.rarg.JoinExpr != null) && !(node.rarg.JoinExpr.alias != null)) {\n output.push(`(${this.deparse(node.rarg)})`);\n } else {\n output.push(this.deparse(node.rarg));\n }\n }\n\n if (node.quals) {\n output.push(`ON ${this.deparse(node.quals)}`);\n }\n\n if (node.usingClause) {\n const using = this.quote(this.deparseNodes(node.usingClause)).join(', ');\n\n output.push(`USING (${using})`);\n }\n\n const wrapped =\n (node.rarg.JoinExpr != null) || node.alias ? '(' + output.join(' ') + ')'\n : output.join(' ');\n\n if (node.alias) {\n return wrapped + ' ' + this.deparse(node.alias);\n }\n\n return wrapped;\n }\n\n ['LockingClause'](node) {\n const strengths = [\n 'NONE', // LCS_NONE\n 'FOR KEY SHARE',\n 'FOR SHARE',\n 'FOR NO KEY UPDATE',\n 'FOR UPDATE'\n ];\n\n const output = [];\n\n output.push(strengths[node.strength]);\n\n if (node.lockedRels) {\n output.push('OF');\n output.push(this.list(node.lockedRels));\n }\n\n return output.join(' ');\n }\n\n ['MinMaxExpr'](node) {\n const output = [];\n\n if (node.op === 0) {\n output.push('GREATEST');\n } else {\n output.push('LEAST');\n }\n\n output.push(parens(this.list(node.args)));\n\n return output.join('');\n }\n\n ['NamedArgExpr'](node) {\n const output = [];\n\n output.push(node.name);\n output.push(':=');\n output.push(this.deparse(node.arg));\n\n return output.join(' ');\n }\n\n ['Null'](node) {\n return 'NULL';\n }\n\n ['NullTest'](node) {\n const output = [ this.deparse(node.arg) ];\n\n if (node.nulltesttype === 0) {\n output.push('IS NULL');\n } else if (node.nulltesttype === 1) {\n output.push('IS NOT NULL');\n }\n\n return output.join(' ');\n }\n\n ['ParamRef'](node) {\n if (node.number >= 0) {\n return [ '$', node.number ].join('');\n }\n return '?';\n }\n\n ['RangeFunction'](node) {\n const output = [];\n\n if (node.lateral) {\n output.push('LATERAL');\n }\n\n const funcs = [];\n\n for (let i = 0; i < node.functions.length; i++) {\n const funcCall = node.functions[i];\n const call = [ this.deparse(funcCall[0]) ];\n\n if (funcCall[1] && funcCall[1].length) {\n call.push(format('AS (%s)', this.list(funcCall[1])));\n }\n\n funcs.push(call.join(' '));\n }\n\n const calls = funcs.join(', ');\n\n if (node.is_rowsfrom) {\n output.push(`ROWS FROM (${calls})`);\n } else {\n output.push(calls);\n }\n\n if (node.ordinality) {\n output.push('WITH ORDINALITY');\n }\n\n if (node.alias) {\n output.push(this.deparse(node.alias));\n }\n\n if (node.coldeflist) {\n const defList = this.list(node.coldeflist);\n\n if (!node.alias) {\n output.push(` AS (${defList})`);\n } else {\n output.push(`(${defList})`);\n }\n }\n\n return output.join(' ');\n }\n\n ['RangeSubselect'](node, context) {\n let output = '';\n\n if (node.lateral) {\n output += 'LATERAL ';\n }\n\n output += parens(this.deparse(node.subquery));\n\n if (node.alias) {\n return output + ' ' + this.deparse(node.alias);\n }\n\n return output;\n }\n\n ['RangeTableSample'](node) {\n const output = [];\n\n output.push(this.deparse(node.relation));\n output.push('TABLESAMPLE');\n output.push(this.deparse(node.method[0]));\n\n if (node.args) {\n output.push(parens(this.list(node.args)));\n }\n\n if (node.repeatable) {\n output.push('REPEATABLE(' + this.deparse(node.repeatable) + ')');\n }\n\n return output.join(' ');\n }\n\n ['RangeVar'](node, context) {\n const output = [];\n\n if (node.inhOpt === 0) {\n output.push('ONLY');\n }\n\n if (node.relpersistence === 'u') {\n output.push('UNLOGGED');\n }\n\n if (node.relpersistence === 't') {\n output.push('TEMPORARY');\n }\n\n if (node.schemaname != null) {\n output.push(this.quote(node.schemaname));\n output.push('.');\n }\n\n output.push(this.quote(node.relname));\n\n if (node.alias) {\n output.push(this.deparse(node.alias));\n }\n\n return output.join(' ');\n }\n\n ['ResTarget'](node, context) {\n if (context === 'select') {\n return compact([ this.deparse(node.val), this.quote(node.name) ]).join(' AS ');\n } else if (context === 'update') {\n return compact([ node.name, this.deparse(node.val) ]).join(' = ');\n } else if (!(node.val != null)) {\n return this.quote(node.name);\n }\n\n return fail('ResTarget', node);\n }\n\n ['RowExpr'](node) {\n if (node.row_format === 2) {\n return parens(this.list(node.args));\n }\n\n return format('ROW(%s)', this.list(node.args));\n }\n\n ['SelectStmt'](node, context) {\n const output = [];\n\n if (node.withClause) {\n output.push(this.deparse(node.withClause));\n }\n\n if (node.op === 0) {\n // VALUES select's don't get SELECT\n if (node.valuesLists == null) {\n output.push('SELECT');\n }\n } else {\n output.push(parens(this.deparse(node.larg)));\n\n const sets = [\n 'NONE',\n 'UNION',\n 'INTERSECT',\n 'EXCEPT'\n ];\n\n output.push(sets[node.op]);\n\n if (node.all) {\n output.push('ALL');\n }\n\n output.push(parens(this.deparse(node.rarg)));\n }\n\n if (node.distinctClause) {\n if (node.distinctClause[0] != null) {\n output.push('DISTINCT ON');\n\n const clause = (node.distinctClause.map(e => this.deparse(e, 'select'))).join(',\\n');\n\n output.push(`(${clause})`);\n } else {\n output.push('DISTINCT');\n }\n }\n\n if (node.targetList) {\n output.push(indent((node.targetList.map(e => this.deparse(e, 'select'))).join(',\\n')));\n }\n\n if (node.intoClause) {\n output.push('INTO');\n output.push(indent(this.deparse(node.intoClause)));\n }\n\n if (node.fromClause) {\n output.push('FROM');\n output.push(indent((node.fromClause.map(e => this.deparse(e, 'from'))).join(',\\n')));\n }\n\n if (node.whereClause) {\n output.push('WHERE');\n output.push(indent(this.deparse(node.whereClause)));\n }\n\n if (node.valuesLists) {\n output.push('VALUES');\n\n const lists = node.valuesLists.map(list => {\n return `(${(list.map(v => this.deparse(v))).join(', ')})`;\n });\n\n output.push(lists.join(', '));\n }\n\n if (node.groupClause) {\n output.push('GROUP BY');\n output.push(indent((node.groupClause.map(e => this.deparse(e, 'group'))).join(',\\n')));\n }\n\n if (node.havingClause) {\n output.push('HAVING');\n output.push(indent(this.deparse(node.havingClause)));\n }\n\n if (node.windowClause) {\n output.push('WINDOW');\n\n const windows = [];\n\n for (let i = 0; i < node.windowClause.length; i++) {\n const w = node.windowClause[i];\n const window = [];\n\n if (w.WindowDef.name) {\n window.push(this.quote(w.WindowDef.name) + ' AS');\n }\n\n window.push(parens(this.deparse(w, 'window')));\n\n windows.push(window.join(' '));\n }\n\n output.push(windows.join(', '));\n }\n\n if (node.sortClause) {\n output.push('ORDER BY');\n output.push(indent((node.sortClause.map(e => this.deparse(e, 'sort'))).join(',\\n')));\n }\n\n if (node.limitCount) {\n output.push('LIMIT');\n output.push(indent(this.deparse(node.limitCount)));\n }\n\n if (node.limitOffset) {\n output.push('OFFSET');\n output.push(indent(this.deparse(node.limitOffset)));\n }\n\n if (node.lockingClause) {\n node.lockingClause.forEach(item => {\n return output.push(this.deparse(item));\n });\n }\n\n return output.join(' ');\n }\n\n ['SortBy'](node) {\n const output = [];\n\n output.push(this.deparse(node.node));\n\n if (node.sortby_dir === 1) {\n output.push('ASC');\n }\n\n if (node.sortby_dir === 2) {\n output.push('DESC');\n }\n\n if (node.sortby_dir === 3) {\n output.push(`USING ${this.deparseNodes(node.useOp)}`);\n }\n\n if (node.sortby_nulls === 1) {\n output.push('NULLS FIRST');\n }\n\n if (node.sortby_nulls === 2) {\n output.push('NULLS LAST');\n }\n\n return output.join(' ');\n }\n\n ['String'](node) {\n return node.str;\n }\n\n ['SubLink'](node) {\n switch (true) {\n case node.subLinkType === 0:\n return format('EXISTS (%s)', this.deparse(node.subselect));\n case node.subLinkType === 1:\n return format('%s %s ALL (%s)', this.deparse(node.testexpr), this.deparse(node.operName[0]), this.deparse(node.subselect));\n case node.subLinkType === 2 && !(node.operName != null):\n return format('%s IN (%s)', this.deparse(node.testexpr), this.deparse(node.subselect));\n case node.subLinkType === 2:\n return format('%s %s ANY (%s)', this.deparse(node.testexpr), this.deparse(node.operName[0]), this.deparse(node.subselect));\n case node.subLinkType === 3:\n return format('%s %s (%s)', this.deparse(node.testexpr), this.deparse(node.operName[0]), this.deparse(node.subselect));\n case node.subLinkType === 4:\n return format('(%s)', this.deparse(node.subselect));\n case node.subLinkType === 5:\n // TODO(zhm) what is this?\n return fail('SubLink', node);\n // MULTIEXPR_SUBLINK\n // format('(%s)', @deparse(node.subselect))\n case node.subLinkType === 6:\n return format('ARRAY (%s)', this.deparse(node.subselect));\n default:\n return fail('SubLink', node);\n }\n }\n\n ['TypeCast'](node) {\n return this.deparse(node.arg) + '::' + this.deparse(node.typeName);\n }\n\n ['TypeName'](node) {\n if (_.last(node.names).String.str === 'interval') {\n return this.deparseInterval(node);\n }\n\n const output = [];\n\n if (node.setof) {\n output.push('SETOF');\n }\n\n let args = null;\n\n if (node.typmods != null) {\n args = node.typmods.map(item => {\n return this.deparse(item);\n });\n }\n\n const type = [];\n\n type.push(this.type(node.names, args && args.join(', ')));\n\n if (node.arrayBounds != null) {\n type.push('[]');\n }\n\n output.push(type.join(''));\n\n return output.join(' ');\n }\n\n ['CaseWhen'](node) {\n const output = [ 'WHEN' ];\n\n output.push(this.deparse(node.expr));\n output.push('THEN');\n output.push(this.deparse(node.result));\n\n return output.join(' ');\n }\n\n ['WindowDef'](node, context) {\n const output = [];\n\n if (context !== 'window') {\n if (node.name) {\n output.push(node.name);\n }\n }\n\n const empty = (!(node.partitionClause != null) && !(node.orderClause != null));\n\n const frameOptions = this.deparseFrameOptions(node.frameOptions, node.refname, node.startOffset, node.endOffset);\n\n if (empty && context !== 'window' && !(node.name != null) && frameOptions.length === 0) {\n return '()';\n }\n\n const windowParts = [];\n\n let useParens = false;\n\n if (node.partitionClause) {\n const partition = [ 'PARTITION BY' ];\n\n const clause = node.partitionClause.map(item => this.deparse(item));\n\n partition.push(clause.join(', '));\n\n windowParts.push(partition.join(' '));\n useParens = true;\n }\n\n if (node.orderClause) {\n windowParts.push('ORDER BY');\n\n const orders = node.orderClause.map(item => {\n return this.deparse(item);\n });\n\n windowParts.push(orders.join(', '));\n\n useParens = true;\n }\n\n if (frameOptions.length) {\n useParens = true;\n windowParts.push(frameOptions);\n }\n\n if (useParens && context !== 'window') {\n return output.join(' ') + ' (' + windowParts.join(' ') + ')';\n }\n\n return output.join(' ') + windowParts.join(' ');\n }\n\n ['WithClause'](node) {\n const output = [ 'WITH' ];\n\n if (node.recursive) {\n output.push('RECURSIVE');\n }\n\n output.push(this.list(node.ctes));\n\n return output.join(' ');\n }\n\n deparseFrameOptions(options, refName, startOffset, endOffset) {\n const FRAMEOPTION_NONDEFAULT = 0x00001; // any specified?\n const FRAMEOPTION_RANGE = 0x00002; // RANGE behavior\n const FRAMEOPTION_ROWS = 0x00004; // ROWS behavior\n const FRAMEOPTION_BETWEEN = 0x00008; // BETWEEN given?\n const FRAMEOPTION_START_UNBOUNDED_PRECEDING = 0x00010; // start is U. P.\n const FRAMEOPTION_END_UNBOUNDED_PRECEDING = 0x00020; // (disallowed)\n const FRAMEOPTION_START_UNBOUNDED_FOLLOWING = 0x00040; // (disallowed)\n const FRAMEOPTION_END_UNBOUNDED_FOLLOWING = 0x00080; // end is U. F.\n const FRAMEOPTION_START_CURRENT_ROW = 0x00100; // start is C. R.\n const FRAMEOPTION_END_CURRENT_ROW = 0x00200; // end is C. R.\n const FRAMEOPTION_START_VALUE_PRECEDING = 0x00400; // start is V. P.\n const FRAMEOPTION_END_VALUE_PRECEDING = 0x00800; // end is V. P.\n const FRAMEOPTION_START_VALUE_FOLLOWING = 0x01000; // start is V. F.\n const FRAMEOPTION_END_VALUE_FOLLOWING = 0x02000; // end is V. F.\n\n if (!(options & FRAMEOPTION_NONDEFAULT)) {\n return '';\n }\n\n const output = [];\n\n if (refName != null) {\n output.push(refName);\n }\n\n if (options & FRAMEOPTION_RANGE) {\n output.push('RANGE');\n }\n\n if (options & FRAMEOPTION_ROWS) {\n output.push('ROWS');\n }\n\n const between = options & FRAMEOPTION_BETWEEN;\n\n if (between) {\n output.push('BETWEEN');\n }\n\n if (options & FRAMEOPTION_START_UNBOUNDED_PRECEDING) {\n output.push('UNBOUNDED PRECEDING');\n }\n\n if (options & FRAMEOPTION_START_UNBOUNDED_FOLLOWING) {\n output.push('UNBOUNDED FOLLOWING');\n }\n\n if (options & FRAMEOPTION_START_CURRENT_ROW) {\n output.push('CURRENT ROW');\n }\n\n if (options & FRAMEOPTION_START_VALUE_PRECEDING) {\n output.push(this.deparse(startOffset) + ' PRECEDING');\n }\n\n if (options & FRAMEOPTION_START_VALUE_FOLLOWING) {\n output.push(this.deparse(startOffset) + ' FOLLOWING');\n }\n\n if (between) {\n output.push('AND');\n\n if (options & FRAMEOPTION_END_UNBOUNDED_PRECEDING) {\n output.push('UNBOUNDED PRECEDING');\n }\n\n if (options & FRAMEOPTION_END_UNBOUNDED_FOLLOWING) {\n output.push('UNBOUNDED FOLLOWING');\n }\n\n if (options & FRAMEOPTION_END_CURRENT_ROW) {\n output.push('CURRENT ROW');\n }\n\n if (options & FRAMEOPTION_END_VALUE_PRECEDING) {\n output.push(this.deparse(endOffset) + ' PRECEDING');\n }\n\n if (options & FRAMEOPTION_END_VALUE_FOLLOWING) {\n output.push(this.deparse(endOffset) + ' FOLLOWING');\n }\n }\n\n return output.join(' ');\n }\n\n deparseInterval(node) {\n const type = [ 'interval' ];\n\n if (node.arrayBounds != null) {\n type.push('[]');\n }\n\n if (node.typmods) {\n const typmods = node.typmods.map(item => this.deparse(item));\n\n let intervals = this.interval(typmods[0]);\n\n // SELECT interval(0) '1 day 01:23:45.6789'\n if (node.typmods[0] && node.typmods[0].A_Const && node.typmods[0].A_Const.val.Integer.ival === 32767 && node.typmods[1] && (node.typmods[1].A_Const != null)) {\n intervals = [ `(${node.typmods[1].A_Const.val.Integer.ival})` ];\n } else {\n intervals = intervals.map(part => {\n if (part === 'second' && typmods.length === 2) {\n return 'second(' + _.last(typmods) + ')';\n }\n\n return part;\n });\n }\n\n type.push(intervals.join(' to '));\n }\n\n return type.join(' ');\n }\n\n interval(mask) {\n // ported from https://github.com/lfittl/pg_query/blob/master/lib/pg_query/deparse/interval.rb\n if (this.MASKS == null) {\n this.MASKS = {\n 0: 'RESERV',\n 1: 'MONTH',\n 2: 'YEAR',\n 3: 'DAY',\n 4: 'JULIAN',\n 5: 'TZ',\n 6: 'DTZ',\n 7: 'DYNTZ',\n 8: 'IGNORE_DTF',\n 9: 'AMPM',\n 10: 'HOUR',\n 11: 'MINUTE',\n 12: 'SECOND',\n 13: 'MILLISECOND',\n 14: 'MICROSECOND',\n 15: 'DOY',\n 16: 'DOW',\n 17: 'UNITS',\n 18: 'ADBC',\n 19: 'AGO',\n 20: 'ABS_BEFORE',\n 21: 'ABS_AFTER',\n 22: 'ISODATE',\n 23: 'ISOTIME',\n 24: 'WEEK',\n 25: 'DECADE',\n 26: 'CENTURY',\n 27: 'MILLENNIUM',\n 28: 'DTZMOD'\n };\n }\n\n if (this.BITS == null) {\n this.BITS = _.invert(this.MASKS);\n }\n\n if (this.INTERVALS == null) {\n this.INTERVALS = {};\n this.INTERVALS[(1 << this.BITS.YEAR)] = [ 'year' ];\n this.INTERVALS[(1 << this.BITS.MONTH)] = [ 'month' ];\n this.INTERVALS[(1 << this.BITS.DAY)] = [ 'day' ];\n this.INTERVALS[(1 << this.BITS.HOUR)] = [ 'hour' ];\n this.INTERVALS[(1 << this.BITS.MINUTE)] = [ 'minute' ];\n this.INTERVALS[(1 << this.BITS.SECOND)] = [ 'second' ];\n this.INTERVALS[(1 << this.BITS.YEAR | 1 << this.BITS.MONTH)] = [ 'year', 'month' ];\n this.INTERVALS[(1 << this.BITS.DAY | 1 << this.BITS.HOUR)] = [ 'day', 'hour' ];\n this.INTERVALS[(1 << this.BITS.DAY | 1 << this.BITS.HOUR | 1 << this.BITS.MINUTE)] = [ 'day', 'minute' ];\n this.INTERVALS[(1 << this.BITS.DAY | 1 << this.BITS.HOUR | 1 << this.BITS.MINUTE | 1 << this.BITS.SECOND)] = [ 'day', 'second' ];\n this.INTERVALS[(1 << this.BITS.HOUR | 1 << this.BITS.MINUTE)] = [ 'hour', 'minute' ];\n this.INTERVALS[(1 << this.BITS.HOUR | 1 << this.BITS.MINUTE | 1 << this.BITS.SECOND)] = [ 'hour', 'second' ];\n this.INTERVALS[(1 << this.BITS.MINUTE | 1 << this.BITS.SECOND)] = [ 'minute', 'second' ];\n\n // utils/timestamp.h\n // #define INTERVAL_FULL_RANGE (0x7FFF)\n this.INTERVALS[this.INTERVAL_FULL_RANGE = '32767'] = [];\n }\n\n return this.INTERVALS[mask.toString()];\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/deparser.js"],"names":["CONSTRAINT_TYPES","keys","compact","o","filter","p","toString","length","fail","type","node","Error","JSON","stringify","parens","string","indent","text","count","Deparser","deparse","query","deparseQuery","constructor","tree","map","join","deparseNodes","nodes","list","separator","quote","value","isArray","escape","literal","replace","convertTypeName","typeName","size","names","args","name","catalog","mods","String","str","res","item","context","isNumber","values","output","kind","lexpr","push","schema","operator","rexpr","op","FuncCall","Null","aliasname","colnames","elements","val","lidx","uidx","arg","i","indirection","subnode","A_Star","prefix","substring","boolop","tests","booltesttype","defresult","collname","colname","raw_default","constraints","fields","field","ctename","aliascolnames","ctequery","params","agg_star","funcname","order","withinGroup","agg_within_group","agg_order","call","agg_distinct","func_variadic","agg_filter","over","content","ival","rel","larg","isNatural","jointype","quals","usingClause","rarg","JoinExpr","alias","using","wrapped","strengths","strength","lockedRels","nulltesttype","number","lateral","funcs","functions","funcCall","calls","is_rowsfrom","ordinality","coldeflist","defList","subquery","relation","method","repeatable","inhOpt","relpersistence","schemaname","relname","row_format","withClause","valuesLists","sets","all","distinctClause","clause","e","targetList","intoClause","fromClause","whereClause","lists","v","groupClause","havingClause","windowClause","windows","w","window","WindowDef","sortClause","limitCount","limitOffset","lockingClause","forEach","tableElts","constraint","contype","conname","pk_attrs","fk_attrs","pktable","ConstraintStmt","getExclusionGroup","a","exclusions","excl","IndexElem","expr","b","access_method","ReferenceConstraint","raw_expr","fk_del_action","fk_upd_action","ExclusionConstraint","argType","parameters","FunctionParameter","mode","param","returns","returnType","elems","options","option","DefElem","defname","as","language","volatility","toUpperCase","sortby_dir","useOp","sortby_nulls","subLinkType","subselect","testexpr","operName","last","deparseInterval","setof","typmods","arrayBounds","result","empty","partitionClause","orderClause","frameOptions","deparseFrameOptions","refname","startOffset","endOffset","windowParts","useParens","partition","orders","recursive","ctes","refName","FRAMEOPTION_NONDEFAULT","FRAMEOPTION_RANGE","FRAMEOPTION_ROWS","FRAMEOPTION_BETWEEN","FRAMEOPTION_START_UNBOUNDED_PRECEDING","FRAMEOPTION_END_UNBOUNDED_PRECEDING","FRAMEOPTION_START_UNBOUNDED_FOLLOWING","FRAMEOPTION_END_UNBOUNDED_FOLLOWING","FRAMEOPTION_START_CURRENT_ROW","FRAMEOPTION_END_CURRENT_ROW","FRAMEOPTION_START_VALUE_PRECEDING","FRAMEOPTION_END_VALUE_PRECEDING","FRAMEOPTION_START_VALUE_FOLLOWING","FRAMEOPTION_END_VALUE_FOLLOWING","between","intervals","interval","A_Const","Integer","part","mask","MASKS","BITS","invert","INTERVALS","YEAR","MONTH","DAY","HOUR","MINUTE","SECOND","INTERVAL_FULL_RANGE"],"mappings":"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","file":"deparser.js","sourcesContent":["import _ from 'lodash';\nimport { format } from 'util';\n\nconst CONSTRAINT_TYPES = [\n 'NULL',\n 'NOT NULL',\n 'DEFAULT',\n 'CHECK',\n 'PRIMARY KEY',\n 'UNIQUE',\n 'EXCLUDE',\n 'REFERENCES'\n];\n\nconst { keys } = _;\n\nconst compact = o => {\n return _.filter(_.compact(o), (p) => {\n if (p == null) {\n return false;\n }\n\n return p.toString().length;\n });\n};\n\nconst fail = (type, node) => {\n throw new Error(format('Unhandled %s node: %s', type, JSON.stringify(node)));\n};\n\nconst parens = (string) => {\n return '(' + string + ')';\n};\n\nconst indent = (text, count = 1) => text;\n\nexport default class Deparser {\n static deparse(query) {\n return new Deparser(query).deparseQuery();\n }\n\n constructor(tree) {\n this.tree = tree;\n }\n\n deparseQuery() {\n return (this.tree.map(node => this.deparse(node))).join('\\n\\n');\n }\n\n deparseNodes(nodes) {\n return nodes.map(node => this.deparse(node));\n }\n\n list(nodes, separator = ', ') {\n if (!nodes) {\n return '';\n }\n\n return this.deparseNodes(nodes).join(separator);\n }\n\n quote(value) {\n if (value == null) {\n return null;\n }\n\n if (_.isArray(value)) {\n return value.map(o => this.quote(o));\n }\n\n return '\"' + value + '\"';\n }\n\n // SELECT encode(E'''123\\\\000\\\\001', 'base64')\n escape(literal) {\n return \"'\" + literal.replace(/'/g, \"''\") + \"'\";\n }\n\n convertTypeName(typeName, size) {\n switch (typeName) {\n case 'bpchar':\n if (size != null) {\n return 'char';\n }\n // return `pg_catalog.bpchar` below so that the following is symmetric\n // SELECT char 'c' = char 'c' AS true\n return 'pg_catalog.bpchar';\n case 'varchar':\n return 'varchar';\n case 'numeric':\n return 'numeric';\n case 'bool':\n return 'boolean';\n case 'int2':\n return 'smallint';\n case 'int4':\n return 'int';\n case 'int8':\n return 'bigint';\n case 'real': case 'float4':\n return 'real';\n case 'float8':\n return 'pg_catalog.float8';\n case 'text':\n // SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True\n return 'pg_catalog.text';\n case 'date':\n return 'pg_catalog.date';\n case 'time':\n return 'time';\n case 'timetz':\n return 'pg_catalog.timetz';\n case 'timestamp':\n return 'timestamp';\n case 'timestamptz':\n return 'pg_catalog.timestamptz';\n case 'interval':\n return 'interval';\n case 'bit':\n return 'bit';\n default:\n throw new Error(format('Unhandled data type: %s', typeName));\n }\n }\n\n type(names, args) {\n const [ catalog, type ] = names.map(name => this.deparse(name));\n\n const mods = (name, size) => {\n if (size != null) {\n return name + '(' + size + ')';\n }\n\n return name;\n };\n\n // handle the special \"char\" (in quotes) type\n if (names[0].String.str === 'char') {\n names[0].String.str = '\"char\"';\n }\n\n if (catalog !== 'pg_catalog') {\n return mods(this.list(names, '.'), args);\n }\n\n const res = this.convertTypeName(type, args);\n\n return mods(res, args);\n }\n\n deparse(item, context) {\n if (item == null) {\n return null;\n }\n\n if (_.isNumber(item)) {\n return item;\n }\n\n const type = keys(item)[0];\n const node = _.values(item)[0];\n\n if (this[type] == null) {\n throw new Error(type + ' is not implemented');\n }\n\n return this[type](node, context);\n }\n\n ['A_Expr'](node, context) {\n const output = [];\n\n switch (node.kind) {\n case 0: // AEXPR_OP\n if (node.lexpr) {\n output.push(parens(this.deparse(node.lexpr)));\n }\n\n if (node.name.length > 1) {\n const schema = this.deparse(node.name[0]);\n const operator = this.deparse(node.name[1]);\n output.push(`OPERATOR(${schema}.${operator})`);\n } else {\n output.push(this.deparse(node.name[0]));\n }\n\n if (node.rexpr) {\n output.push(parens(this.deparse(node.rexpr)));\n }\n\n if (output.length === 2) {\n return parens(output.join(''));\n }\n\n return parens(output.join(' '));\n\n case 1: // AEXPR_OP_ANY\n output.push(this.deparse(node.lexpr));\n output.push(format('ANY (%s)', this.deparse(node.rexpr)));\n return output.join(` ${this.deparse(node.name[0])} `);\n\n case 2: // AEXPR_OP_ALL\n output.push(this.deparse(node.lexpr));\n output.push(format('ALL (%s)', this.deparse(node.rexpr)));\n return output.join(` ${this.deparse(node.name[0])} `);\n\n case 3: // AEXPR_DISTINCT\n return format('%s IS DISTINCT FROM %s', this.deparse(node.lexpr), this.deparse(node.rexpr));\n\n case 4: // AEXPR_NULLIF\n return format('NULLIF(%s, %s)', this.deparse(node.lexpr), this.deparse(node.rexpr));\n\n case 5: { // AEXPR_OF\n const op = node.name[0].String.str === '=' ? 'IS OF' : 'IS NOT OF';\n return format('%s %s (%s)', this.deparse(node.lexpr), op, this.list(node.rexpr));\n }\n\n case 6: { // AEXPR_IN\n const operator = node.name[0].String.str === '=' ? 'IN' : 'NOT IN';\n\n return format('%s %s (%s)', this.deparse(node.lexpr), operator, this.list(node.rexpr));\n }\n\n case 7: // AEXPR_LIKE\n output.push(this.deparse(node.lexpr));\n\n if (node.name[0].String.str === '!~~') {\n output.push(format('NOT LIKE (%s)', this.deparse(node.rexpr)));\n } else {\n output.push(format('LIKE (%s)', this.deparse(node.rexpr)));\n }\n\n return output.join(' ');\n\n case 8: // AEXPR_ILIKE\n output.push(this.deparse(node.lexpr));\n\n if (node.name[0].String.str === '!~~*') {\n output.push(format('NOT ILIKE (%s)', this.deparse(node.rexpr)));\n } else {\n output.push(format('ILIKE (%s)', this.deparse(node.rexpr)));\n }\n\n return output.join(' ');\n\n case 9: // AEXPR_SIMILAR\n // SIMILAR TO emits a similar_escape FuncCall node with the first argument\n output.push(this.deparse(node.lexpr));\n\n if (this.deparse(node.rexpr.FuncCall.args[1].Null)) {\n output.push(format('SIMILAR TO %s', this.deparse(node.rexpr.FuncCall.args[0])));\n } else {\n output.push(format('SIMILAR TO %s ESCAPE %s',\n this.deparse(node.rexpr.FuncCall.args[0]),\n this.deparse(node.rexpr.FuncCall.args[1])));\n }\n\n return output.join(' ');\n\n case 10: // AEXPR_BETWEEN TODO(zhm) untested\n output.push(this.deparse(node.lexpr));\n output.push(format('BETWEEN %s AND %s', this.deparse(node.rexpr[0]), this.deparse(node.rexpr[1])));\n return output.join(' ');\n\n case 11: // AEXPR_NOT_BETWEEN TODO(zhm) untested\n output.push(this.deparse(node.lexpr));\n output.push(format('NOT BETWEEN %s AND %s', this.deparse(node.rexpr[0]), this.deparse(node.rexpr[1])));\n return output.join(' ');\n\n default:\n return fail('A_Expr', node);\n }\n }\n\n ['Alias'](node, context) {\n const name = node.aliasname;\n\n const output = [ 'AS' ];\n\n if (node.colnames) {\n output.push(name + parens(this.list(node.colnames)));\n } else {\n output.push(this.quote(name));\n }\n\n return output.join(' ');\n }\n\n ['A_ArrayExpr'](node) {\n return format('ARRAY[%s]', this.list(node.elements));\n }\n\n ['A_Const'](node, context) {\n if (node.val.String) {\n return this.escape(this.deparse(node.val));\n }\n\n return this.deparse(node.val);\n }\n\n ['A_Indices'](node) {\n if (node.lidx) {\n return format('[%s:%s]', this.deparse(node.lidx), this.deparse(node.uidx));\n }\n\n return format('[%s]', this.deparse(node.uidx));\n }\n\n ['A_Indirection'](node) {\n const output = [ `(${this.deparse(node.arg)})` ];\n\n // TODO(zhm) figure out the actual rules for when a '.' is needed\n //\n // select a.b[0] from a;\n // select (select row(1)).*\n // select c2[2].f2 from comptable\n // select c2.a[2].f2[1].f3[0].a1 from comptable\n\n for (let i = 0; i < node.indirection.length; i++) {\n const subnode = node.indirection[i];\n\n if (subnode.String || subnode.A_Star) {\n const value = subnode.A_Star ? '*' : this.quote(subnode.String.str);\n\n output.push(`.${value}`);\n } else {\n output.push(this.deparse(subnode));\n }\n }\n\n return output.join('');\n }\n\n ['A_Star'](node, context) {\n return '*';\n }\n\n ['BitString'](node) {\n const prefix = node.str[0];\n return `${prefix}'${node.str.substring(1)}'`;\n }\n\n ['BoolExpr'](node) {\n switch (node.boolop) {\n case 0:\n return parens(this.list(node.args, ' AND '));\n case 1:\n return parens(this.list(node.args, ' OR '));\n case 2:\n return format('NOT (%s)', this.deparse(node.args[0]));\n default:\n return fail('BoolExpr', node);\n }\n }\n\n ['BooleanTest'](node) {\n const output = [];\n\n output.push(this.deparse(node.arg));\n\n const tests = [\n 'IS TRUE',\n 'IS NOT TRUE',\n 'IS FALSE',\n 'IS NOT FALSE',\n 'IS UNKNOWN',\n 'IS NOT UNKNOWN'\n ];\n\n output.push(tests[node.booltesttype]);\n\n return output.join(' ');\n }\n\n ['CaseExpr'](node) {\n const output = [ 'CASE' ];\n\n if (node.arg) {\n output.push(this.deparse(node.arg));\n }\n\n for (let i = 0; i < node.args.length; i++) {\n output.push(this.deparse(node.args[i]));\n }\n\n if (node.defresult) {\n output.push('ELSE');\n output.push(this.deparse(node.defresult));\n }\n\n output.push('END');\n\n return output.join(' ');\n }\n\n ['CoalesceExpr'](node) {\n return format('COALESCE(%s)', this.list(node.args));\n }\n\n ['CollateClause'](node) {\n const output = [];\n\n if (node.arg) {\n output.push(this.deparse(node.arg));\n }\n\n output.push('COLLATE');\n\n if (node.collname) {\n output.push(this.quote(this.deparseNodes(node.collname)));\n }\n\n return output.join(' ');\n }\n\n ['ColumnDef'](node) {\n const output = [ this.quote(node.colname) ];\n\n output.push(this.deparse(node.typeName));\n\n if (node.raw_default) {\n output.push('USING');\n output.push(this.deparse(node.raw_default));\n }\n\n if (node.constraints) {\n output.push(this.list(node.constraints, ' '));\n }\n\n return _.compact(output).join(' ');\n }\n\n ['ColumnRef'](node) {\n const fields = node.fields.map(field => {\n if (field.String) {\n return this.quote(this.deparse(field));\n }\n\n return this.deparse(field);\n });\n\n return fields.join('.');\n }\n\n ['CommonTableExpr'](node) {\n const output = [];\n\n output.push(node.ctename);\n\n if (node.aliascolnames) {\n output.push(format('(%s)', this.quote(this.deparseNodes(node.aliascolnames))));\n }\n\n output.push(format('AS (%s)', this.deparse(node.ctequery)));\n\n return output.join(' ');\n }\n\n ['Float'](node) {\n // wrap negative numbers in parens, SELECT (-2147483648)::int4 * (-1)::int4\n if (node.str[0] === '-') {\n return `(${node.str})`;\n }\n\n return node.str;\n }\n\n ['FuncCall'](node, context) {\n const output = [];\n\n let params = [];\n\n if (node.args) {\n params = node.args.map(item => {\n return this.deparse(item);\n });\n }\n\n // COUNT(*)\n if (node.agg_star) {\n params.push('*');\n }\n\n const name = this.list(node.funcname, '.');\n\n const order = [];\n\n const withinGroup = node.agg_within_group;\n\n if (node.agg_order) {\n order.push('ORDER BY');\n order.push(this.list(node.agg_order, ', '));\n }\n\n const call = [];\n\n call.push(name + '(');\n\n if (node.agg_distinct) {\n call.push('DISTINCT ');\n }\n\n // prepend variadic before the last parameter\n // SELECT CONCAT('|', VARIADIC ARRAY['1','2','3'])\n if (node.func_variadic) {\n params[params.length - 1] = 'VARIADIC ' + params[params.length - 1];\n }\n\n call.push(params.join(', '));\n\n if (order.length && !withinGroup) {\n call.push(' ');\n call.push(order.join(' '));\n }\n\n call.push(')');\n\n output.push(compact(call).join(''));\n\n if (order.length && withinGroup) {\n output.push('WITHIN GROUP');\n output.push(parens(order.join(' ')));\n }\n\n if (node.agg_filter != null) {\n output.push(format('FILTER (WHERE %s)', this.deparse(node.agg_filter)));\n }\n\n if (node.over != null) {\n output.push(format('OVER %s', this.deparse(node.over)));\n }\n\n return output.join(' ');\n }\n\n ['GroupingFunc'](node) {\n return 'GROUPING(' + this.list(node.args) + ')';\n }\n\n ['GroupingSet'](node) {\n switch (node.kind) {\n case 0: // GROUPING_SET_EMPTY\n return '()';\n\n case 1: // GROUPING_SET_SIMPLE\n return fail('GroupingSet', node);\n\n case 2: // GROUPING_SET_ROLLUP\n return 'ROLLUP (' + this.list(node.content) + ')';\n\n case 3: // GROUPING_SET_CUBE\n return 'CUBE (' + this.list(node.content) + ')';\n\n case 4: // GROUPING_SET_SETS\n return 'GROUPING SETS (' + this.list(node.content) + ')';\n\n default:\n return fail('GroupingSet', node);\n }\n }\n\n ['Integer'](node) {\n if (node.ival < 0) {\n return `(${node.ival})`;\n }\n\n return node.ival.toString();\n }\n\n ['IntoClause'](node) {\n return this.deparse(node.rel);\n }\n\n ['JoinExpr'](node, context) {\n const output = [];\n\n output.push(this.deparse(node.larg));\n\n if (node.isNatural) {\n output.push('NATURAL');\n }\n\n let join = null;\n\n switch (true) {\n case node.jointype === 0 && (node.quals != null):\n join = 'INNER JOIN';\n break;\n\n case node.jointype === 0 && !node.isNatural && !(node.quals != null) && !(node.usingClause != null):\n join = 'CROSS JOIN';\n break;\n\n case node.jointype === 0:\n join = 'JOIN';\n break;\n\n case node.jointype === 1:\n join = 'LEFT OUTER JOIN';\n break;\n\n case node.jointype === 2:\n join = 'FULL OUTER JOIN';\n break;\n\n case node.jointype === 3:\n join = 'RIGHT OUTER JOIN';\n break;\n\n default:\n fail('JoinExpr', node);\n break;\n }\n\n output.push(join);\n\n if (node.rarg) {\n // wrap nested join expressions in parens to make the following symmetric:\n // select * from int8_tbl x cross join (int4_tbl x cross join lateral (select x.f1) ss)\n if ((node.rarg.JoinExpr != null) && !(node.rarg.JoinExpr.alias != null)) {\n output.push(`(${this.deparse(node.rarg)})`);\n } else {\n output.push(this.deparse(node.rarg));\n }\n }\n\n if (node.quals) {\n output.push(`ON ${this.deparse(node.quals)}`);\n }\n\n if (node.usingClause) {\n const using = this.quote(this.deparseNodes(node.usingClause)).join(', ');\n\n output.push(`USING (${using})`);\n }\n\n const wrapped =\n (node.rarg.JoinExpr != null) || node.alias ? '(' + output.join(' ') + ')'\n : output.join(' ');\n\n if (node.alias) {\n return wrapped + ' ' + this.deparse(node.alias);\n }\n\n return wrapped;\n }\n\n ['LockingClause'](node) {\n const strengths = [\n 'NONE', // LCS_NONE\n 'FOR KEY SHARE',\n 'FOR SHARE',\n 'FOR NO KEY UPDATE',\n 'FOR UPDATE'\n ];\n\n const output = [];\n\n output.push(strengths[node.strength]);\n\n if (node.lockedRels) {\n output.push('OF');\n output.push(this.list(node.lockedRels));\n }\n\n return output.join(' ');\n }\n\n ['MinMaxExpr'](node) {\n const output = [];\n\n if (node.op === 0) {\n output.push('GREATEST');\n } else {\n output.push('LEAST');\n }\n\n output.push(parens(this.list(node.args)));\n\n return output.join('');\n }\n\n ['NamedArgExpr'](node) {\n const output = [];\n\n output.push(node.name);\n output.push(':=');\n output.push(this.deparse(node.arg));\n\n return output.join(' ');\n }\n\n ['Null'](node) {\n return 'NULL';\n }\n\n ['NullTest'](node) {\n const output = [ this.deparse(node.arg) ];\n\n if (node.nulltesttype === 0) {\n output.push('IS NULL');\n } else if (node.nulltesttype === 1) {\n output.push('IS NOT NULL');\n }\n\n return output.join(' ');\n }\n\n ['ParamRef'](node) {\n if (node.number >= 0) {\n return [ '$', node.number ].join('');\n }\n return '?';\n }\n\n ['RangeFunction'](node) {\n const output = [];\n\n if (node.lateral) {\n output.push('LATERAL');\n }\n\n const funcs = [];\n\n for (let i = 0; i < node.functions.length; i++) {\n const funcCall = node.functions[i];\n const call = [ this.deparse(funcCall[0]) ];\n\n if (funcCall[1] && funcCall[1].length) {\n call.push(format('AS (%s)', this.list(funcCall[1])));\n }\n\n funcs.push(call.join(' '));\n }\n\n const calls = funcs.join(', ');\n\n if (node.is_rowsfrom) {\n output.push(`ROWS FROM (${calls})`);\n } else {\n output.push(calls);\n }\n\n if (node.ordinality) {\n output.push('WITH ORDINALITY');\n }\n\n if (node.alias) {\n output.push(this.deparse(node.alias));\n }\n\n if (node.coldeflist) {\n const defList = this.list(node.coldeflist);\n\n if (!node.alias) {\n output.push(` AS (${defList})`);\n } else {\n output.push(`(${defList})`);\n }\n }\n\n return output.join(' ');\n }\n\n ['RangeSubselect'](node, context) {\n let output = '';\n\n if (node.lateral) {\n output += 'LATERAL ';\n }\n\n output += parens(this.deparse(node.subquery));\n\n if (node.alias) {\n return output + ' ' + this.deparse(node.alias);\n }\n\n return output;\n }\n\n ['RangeTableSample'](node) {\n const output = [];\n\n output.push(this.deparse(node.relation));\n output.push('TABLESAMPLE');\n output.push(this.deparse(node.method[0]));\n\n if (node.args) {\n output.push(parens(this.list(node.args)));\n }\n\n if (node.repeatable) {\n output.push('REPEATABLE(' + this.deparse(node.repeatable) + ')');\n }\n\n return output.join(' ');\n }\n\n ['RangeVar'](node, context) {\n const output = [];\n\n if (node.inhOpt === 0) {\n output.push('ONLY');\n }\n\n if (node.relpersistence === 'u') {\n output.push('UNLOGGED');\n }\n\n if (node.relpersistence === 't') {\n output.push('TEMPORARY');\n }\n\n if (node.schemaname != null) {\n output.push(this.quote(node.schemaname));\n output.push('.');\n }\n\n output.push(this.quote(node.relname));\n\n if (node.alias) {\n output.push(this.deparse(node.alias));\n }\n\n return output.join(' ');\n }\n\n ['ResTarget'](node, context) {\n if (context === 'select') {\n return compact([ this.deparse(node.val), this.quote(node.name) ]).join(' AS ');\n } else if (context === 'update') {\n return compact([ node.name, this.deparse(node.val) ]).join(' = ');\n } else if (!(node.val != null)) {\n return this.quote(node.name);\n }\n\n return fail('ResTarget', node);\n }\n\n ['RowExpr'](node) {\n if (node.row_format === 2) {\n return parens(this.list(node.args));\n }\n\n return format('ROW(%s)', this.list(node.args));\n }\n\n ['SelectStmt'](node, context) {\n const output = [];\n\n if (node.withClause) {\n output.push(this.deparse(node.withClause));\n }\n\n if (node.op === 0) {\n // VALUES select's don't get SELECT\n if (node.valuesLists == null) {\n output.push('SELECT');\n }\n } else {\n output.push(parens(this.deparse(node.larg)));\n\n const sets = [\n 'NONE',\n 'UNION',\n 'INTERSECT',\n 'EXCEPT'\n ];\n\n output.push(sets[node.op]);\n\n if (node.all) {\n output.push('ALL');\n }\n\n output.push(parens(this.deparse(node.rarg)));\n }\n\n if (node.distinctClause) {\n if (node.distinctClause[0] != null) {\n output.push('DISTINCT ON');\n\n const clause = (node.distinctClause.map(e => this.deparse(e, 'select'))).join(',\\n');\n\n output.push(`(${clause})`);\n } else {\n output.push('DISTINCT');\n }\n }\n\n if (node.targetList) {\n output.push(indent((node.targetList.map(e => this.deparse(e, 'select'))).join(',\\n')));\n }\n\n if (node.intoClause) {\n output.push('INTO');\n output.push(indent(this.deparse(node.intoClause)));\n }\n\n if (node.fromClause) {\n output.push('FROM');\n output.push(indent((node.fromClause.map(e => this.deparse(e, 'from'))).join(',\\n')));\n }\n\n if (node.whereClause) {\n output.push('WHERE');\n output.push(indent(this.deparse(node.whereClause)));\n }\n\n if (node.valuesLists) {\n output.push('VALUES');\n\n const lists = node.valuesLists.map(list => {\n return `(${(list.map(v => this.deparse(v))).join(', ')})`;\n });\n\n output.push(lists.join(', '));\n }\n\n if (node.groupClause) {\n output.push('GROUP BY');\n output.push(indent((node.groupClause.map(e => this.deparse(e, 'group'))).join(',\\n')));\n }\n\n if (node.havingClause) {\n output.push('HAVING');\n output.push(indent(this.deparse(node.havingClause)));\n }\n\n if (node.windowClause) {\n output.push('WINDOW');\n\n const windows = [];\n\n for (let i = 0; i < node.windowClause.length; i++) {\n const w = node.windowClause[i];\n const window = [];\n\n if (w.WindowDef.name) {\n window.push(this.quote(w.WindowDef.name) + ' AS');\n }\n\n window.push(parens(this.deparse(w, 'window')));\n\n windows.push(window.join(' '));\n }\n\n output.push(windows.join(', '));\n }\n\n if (node.sortClause) {\n output.push('ORDER BY');\n output.push(indent((node.sortClause.map(e => this.deparse(e, 'sort'))).join(',\\n')));\n }\n\n if (node.limitCount) {\n output.push('LIMIT');\n output.push(indent(this.deparse(node.limitCount)));\n }\n\n if (node.limitOffset) {\n output.push('OFFSET');\n output.push(indent(this.deparse(node.limitOffset)));\n }\n\n if (node.lockingClause) {\n node.lockingClause.forEach(item => {\n return output.push(this.deparse(item));\n });\n }\n\n return output.join(' ');\n }\n\n ['CreateStmt'](node) {\n const output = [];\n output.push('CREATE TABLE');\n output.push(this.deparse(node.relation));\n output.push('(');\n output.push(this.list(node.tableElts));\n output.push(')');\n output.push(';');\n return output.join(' ');\n }\n\n ['ConstraintStmt'](node) {\n const output = [];\n const constraint = CONSTRAINT_TYPES[node.contype];\n\n if (node.conname) {\n output.push(`CONSTRAINT ${node.conname} ${constraint}`);\n } else {\n output.push(constraint);\n }\n\n return output.join(' ');\n }\n\n ['ReferenceConstraint'](node) {\n const output = [];\n if (node.pk_attrs && node.fk_attrs) {\n output.push('FOREIGN KEY');\n output.push('(');\n output.push(this.list(node.fk_attrs));\n output.push(')');\n output.push('REFERENCES');\n output.push(this.deparse(node.pktable));\n output.push('(');\n output.push(this.list(node.pk_attrs));\n output.push(')');\n } else if (node.pk_attrs) {\n output.push(this.ConstraintStmt(node));\n output.push(this.deparse(node.pktable));\n output.push('(');\n output.push(this.list(node.pk_attrs));\n output.push(')');\n } else {\n output.push(this.ConstraintStmt(node));\n output.push(this.deparse(node.pktable));\n }\n return output.join(' ');\n }\n\n ['ExclusionConstraint'](node) {\n const output = [];\n function getExclusionGroup(node) {\n var output = [];\n var a = node.exclusions.map(excl => {\n if (excl[0].IndexElem.name) {\n return excl[0].IndexElem.name;\n } else if (excl[0].IndexElem.expr) {\n return this.deparse(excl[0].IndexElem.expr);\n }\n });\n\n var b = node.exclusions.map(excl => this.deparse(excl[1][0]));\n\n for (var i = 0; i < a.length; i++) {\n output.push(`${a[i]} WITH ${b[i]}`);\n i !== a.length - 1 && output.push(',');\n }\n\n return output.join(' ');\n }\n\n if (node.exclusions && node.access_method) {\n output.push('USING');\n output.push(node.access_method);\n output.push('(');\n output.push(getExclusionGroup.call(this, node));\n output.push(')');\n }\n\n return output.join(' ');\n }\n\n ['Constraint'](node) {\n const output = [];\n\n const constraint = CONSTRAINT_TYPES[node.contype];\n if (!constraint) {\n throw new Error('type not implemented: ' + node.contype);\n }\n\n if (constraint === 'REFERENCES') {\n output.push(this.ReferenceConstraint(node));\n } else {\n output.push(this.ConstraintStmt(node));\n }\n\n if (node.keys) {\n output.push('(');\n output.push(this.list(node.keys));\n output.push(')');\n }\n\n if (node.raw_expr) {\n output.push(this.deparse(node.raw_expr));\n }\n\n if (node.fk_del_action) {\n switch (node.fk_del_action) {\n case 'r':\n output.push('ON DELETE RESTRICT');\n break;\n case 'c':\n output.push('ON DELETE CASCADE');\n break;\n default:\n }\n }\n\n if (node.fk_upd_action) {\n switch (node.fk_upd_action) {\n case 'r':\n output.push('ON UPDATE RESTRICT');\n break;\n case 'c':\n output.push('ON UPDATE CASCADE');\n break;\n default:\n }\n }\n\n if (constraint === 'EXCLUDE') {\n output.push(this.ExclusionConstraint(node));\n }\n\n return output.join(' ');\n }\n\n ['FunctionParameter'](node) {\n const output = [];\n\n output.push(node.name);\n output.push(this.deparse(node.argType));\n\n return output.join(' ');\n }\n\n ['CreateFunctionStmt'](node) {\n const output = [];\n\n output.push('CREATE');\n if (node.replace) {\n output.push('OR REPLACE');\n }\n output.push('FUNCTION');\n\n output.push(node.funcname.map(name => this.deparse(name)).join('.'));\n output.push('(');\n output.push(\n node.parameters\n .filter(({ FunctionParameter }) => FunctionParameter.mode === 105)\n .map(param => this.deparse(param))\n .join(', ')\n );\n output.push(')');\n\n var returns = node.parameters.filter(\n ({ FunctionParameter }) => FunctionParameter.mode === 116\n );\n // var setof = node.parameters.filter(\n // ({ FunctionParameter }) => FunctionParameter.mode === 109\n // );\n\n output.push('RETURNS');\n if (returns.length) {\n output.push('TABLE');\n output.push('(');\n output.push(\n node.parameters\n .filter(({ FunctionParameter }) => FunctionParameter.mode === 116)\n .map(param => this.deparse(param))\n .join(', ')\n );\n output.push(')');\n } else {\n output.push(this.deparse(node.returnType));\n }\n\n var elems = {};\n\n node.options.forEach(option => {\n if (option && option.DefElem) {\n switch (option.DefElem.defname) {\n case 'as':\n elems.as = option;\n break;\n\n case 'language':\n elems.language = option;\n break;\n\n case 'volatility':\n elems.volatility = option;\n break;\n }\n }\n });\n\n output.push(`\nAS $$${this.deparse(elems.as.DefElem.arg[0])}$$\nLANGUAGE '${this.deparse(elems.language.DefElem.arg)}' ${this.deparse(elems.volatility.DefElem.arg).toUpperCase()};\n`);\n\n return output.join(' ');\n }\n ['CreateSchemaStmt'](node) {\n const output = [];\n\n output.push('CREATE');\n if (node.replace) {\n output.push('OR REPLACE');\n }\n output.push('SCHEMA');\n output.push(node.schemaname);\n return output.join(' ');\n }\n\n ['TransactionStmt'](node) {\n switch (node.kind) {\n case 0:\n return 'BEGIN';\n break;\n case 1:\n break;\n case 2:\n return 'COMMIT';\n default:\n }\n }\n\n ['SortBy'](node) {\n const output = [];\n\n output.push(this.deparse(node.node));\n\n if (node.sortby_dir === 1) {\n output.push('ASC');\n }\n\n if (node.sortby_dir === 2) {\n output.push('DESC');\n }\n\n if (node.sortby_dir === 3) {\n output.push(`USING ${this.deparseNodes(node.useOp)}`);\n }\n\n if (node.sortby_nulls === 1) {\n output.push('NULLS FIRST');\n }\n\n if (node.sortby_nulls === 2) {\n output.push('NULLS LAST');\n }\n\n return output.join(' ');\n }\n\n ['String'](node) {\n return node.str;\n }\n\n ['SubLink'](node) {\n switch (true) {\n case node.subLinkType === 0:\n return format('EXISTS (%s)', this.deparse(node.subselect));\n case node.subLinkType === 1:\n return format('%s %s ALL (%s)', this.deparse(node.testexpr), this.deparse(node.operName[0]), this.deparse(node.subselect));\n case node.subLinkType === 2 && !(node.operName != null):\n return format('%s IN (%s)', this.deparse(node.testexpr), this.deparse(node.subselect));\n case node.subLinkType === 2:\n return format('%s %s ANY (%s)', this.deparse(node.testexpr), this.deparse(node.operName[0]), this.deparse(node.subselect));\n case node.subLinkType === 3:\n return format('%s %s (%s)', this.deparse(node.testexpr), this.deparse(node.operName[0]), this.deparse(node.subselect));\n case node.subLinkType === 4:\n return format('(%s)', this.deparse(node.subselect));\n case node.subLinkType === 5:\n // TODO(zhm) what is this?\n return fail('SubLink', node);\n // MULTIEXPR_SUBLINK\n // format('(%s)', @deparse(node.subselect))\n case node.subLinkType === 6:\n return format('ARRAY (%s)', this.deparse(node.subselect));\n default:\n return fail('SubLink', node);\n }\n }\n\n ['TypeCast'](node) {\n return this.deparse(node.arg) + '::' + this.deparse(node.typeName);\n }\n\n ['TypeName'](node) {\n if (_.last(node.names).String.str === 'interval') {\n return this.deparseInterval(node);\n }\n\n const output = [];\n\n if (node.setof) {\n output.push('SETOF');\n }\n\n let args = null;\n\n if (node.typmods != null) {\n args = node.typmods.map(item => {\n return this.deparse(item);\n });\n }\n\n const type = [];\n\n type.push(this.type(node.names, args && args.join(', ')));\n\n if (node.arrayBounds != null) {\n type.push('[]');\n }\n\n output.push(type.join(''));\n\n return output.join(' ');\n }\n\n ['CaseWhen'](node) {\n const output = [ 'WHEN' ];\n\n output.push(this.deparse(node.expr));\n output.push('THEN');\n output.push(this.deparse(node.result));\n\n return output.join(' ');\n }\n\n ['WindowDef'](node, context) {\n const output = [];\n\n if (context !== 'window') {\n if (node.name) {\n output.push(node.name);\n }\n }\n\n const empty = (!(node.partitionClause != null) && !(node.orderClause != null));\n\n const frameOptions = this.deparseFrameOptions(node.frameOptions, node.refname, node.startOffset, node.endOffset);\n\n if (empty && context !== 'window' && !(node.name != null) && frameOptions.length === 0) {\n return '()';\n }\n\n const windowParts = [];\n\n let useParens = false;\n\n if (node.partitionClause) {\n const partition = [ 'PARTITION BY' ];\n\n const clause = node.partitionClause.map(item => this.deparse(item));\n\n partition.push(clause.join(', '));\n\n windowParts.push(partition.join(' '));\n useParens = true;\n }\n\n if (node.orderClause) {\n windowParts.push('ORDER BY');\n\n const orders = node.orderClause.map(item => {\n return this.deparse(item);\n });\n\n windowParts.push(orders.join(', '));\n\n useParens = true;\n }\n\n if (frameOptions.length) {\n useParens = true;\n windowParts.push(frameOptions);\n }\n\n if (useParens && context !== 'window') {\n return output.join(' ') + ' (' + windowParts.join(' ') + ')';\n }\n\n return output.join(' ') + windowParts.join(' ');\n }\n\n ['WithClause'](node) {\n const output = [ 'WITH' ];\n\n if (node.recursive) {\n output.push('RECURSIVE');\n }\n\n output.push(this.list(node.ctes));\n\n return output.join(' ');\n }\n\n deparseFrameOptions(options, refName, startOffset, endOffset) {\n const FRAMEOPTION_NONDEFAULT = 0x00001; // any specified?\n const FRAMEOPTION_RANGE = 0x00002; // RANGE behavior\n const FRAMEOPTION_ROWS = 0x00004; // ROWS behavior\n const FRAMEOPTION_BETWEEN = 0x00008; // BETWEEN given?\n const FRAMEOPTION_START_UNBOUNDED_PRECEDING = 0x00010; // start is U. P.\n const FRAMEOPTION_END_UNBOUNDED_PRECEDING = 0x00020; // (disallowed)\n const FRAMEOPTION_START_UNBOUNDED_FOLLOWING = 0x00040; // (disallowed)\n const FRAMEOPTION_END_UNBOUNDED_FOLLOWING = 0x00080; // end is U. F.\n const FRAMEOPTION_START_CURRENT_ROW = 0x00100; // start is C. R.\n const FRAMEOPTION_END_CURRENT_ROW = 0x00200; // end is C. R.\n const FRAMEOPTION_START_VALUE_PRECEDING = 0x00400; // start is V. P.\n const FRAMEOPTION_END_VALUE_PRECEDING = 0x00800; // end is V. P.\n const FRAMEOPTION_START_VALUE_FOLLOWING = 0x01000; // start is V. F.\n const FRAMEOPTION_END_VALUE_FOLLOWING = 0x02000; // end is V. F.\n\n if (!(options & FRAMEOPTION_NONDEFAULT)) {\n return '';\n }\n\n const output = [];\n\n if (refName != null) {\n output.push(refName);\n }\n\n if (options & FRAMEOPTION_RANGE) {\n output.push('RANGE');\n }\n\n if (options & FRAMEOPTION_ROWS) {\n output.push('ROWS');\n }\n\n const between = options & FRAMEOPTION_BETWEEN;\n\n if (between) {\n output.push('BETWEEN');\n }\n\n if (options & FRAMEOPTION_START_UNBOUNDED_PRECEDING) {\n output.push('UNBOUNDED PRECEDING');\n }\n\n if (options & FRAMEOPTION_START_UNBOUNDED_FOLLOWING) {\n output.push('UNBOUNDED FOLLOWING');\n }\n\n if (options & FRAMEOPTION_START_CURRENT_ROW) {\n output.push('CURRENT ROW');\n }\n\n if (options & FRAMEOPTION_START_VALUE_PRECEDING) {\n output.push(this.deparse(startOffset) + ' PRECEDING');\n }\n\n if (options & FRAMEOPTION_START_VALUE_FOLLOWING) {\n output.push(this.deparse(startOffset) + ' FOLLOWING');\n }\n\n if (between) {\n output.push('AND');\n\n if (options & FRAMEOPTION_END_UNBOUNDED_PRECEDING) {\n output.push('UNBOUNDED PRECEDING');\n }\n\n if (options & FRAMEOPTION_END_UNBOUNDED_FOLLOWING) {\n output.push('UNBOUNDED FOLLOWING');\n }\n\n if (options & FRAMEOPTION_END_CURRENT_ROW) {\n output.push('CURRENT ROW');\n }\n\n if (options & FRAMEOPTION_END_VALUE_PRECEDING) {\n output.push(this.deparse(endOffset) + ' PRECEDING');\n }\n\n if (options & FRAMEOPTION_END_VALUE_FOLLOWING) {\n output.push(this.deparse(endOffset) + ' FOLLOWING');\n }\n }\n\n return output.join(' ');\n }\n\n deparseInterval(node) {\n const type = [ 'interval' ];\n\n if (node.arrayBounds != null) {\n type.push('[]');\n }\n\n if (node.typmods) {\n const typmods = node.typmods.map(item => this.deparse(item));\n\n let intervals = this.interval(typmods[0]);\n\n // SELECT interval(0) '1 day 01:23:45.6789'\n if (node.typmods[0] && node.typmods[0].A_Const && node.typmods[0].A_Const.val.Integer.ival === 32767 && node.typmods[1] && (node.typmods[1].A_Const != null)) {\n intervals = [ `(${node.typmods[1].A_Const.val.Integer.ival})` ];\n } else {\n intervals = intervals.map(part => {\n if (part === 'second' && typmods.length === 2) {\n return 'second(' + _.last(typmods) + ')';\n }\n\n return part;\n });\n }\n\n type.push(intervals.join(' to '));\n }\n\n return type.join(' ');\n }\n\n interval(mask) {\n // ported from https://github.com/lfittl/pg_query/blob/master/lib/pg_query/deparse/interval.rb\n if (this.MASKS == null) {\n this.MASKS = {\n 0: 'RESERV',\n 1: 'MONTH',\n 2: 'YEAR',\n 3: 'DAY',\n 4: 'JULIAN',\n 5: 'TZ',\n 6: 'DTZ',\n 7: 'DYNTZ',\n 8: 'IGNORE_DTF',\n 9: 'AMPM',\n 10: 'HOUR',\n 11: 'MINUTE',\n 12: 'SECOND',\n 13: 'MILLISECOND',\n 14: 'MICROSECOND',\n 15: 'DOY',\n 16: 'DOW',\n 17: 'UNITS',\n 18: 'ADBC',\n 19: 'AGO',\n 20: 'ABS_BEFORE',\n 21: 'ABS_AFTER',\n 22: 'ISODATE',\n 23: 'ISOTIME',\n 24: 'WEEK',\n 25: 'DECADE',\n 26: 'CENTURY',\n 27: 'MILLENNIUM',\n 28: 'DTZMOD'\n };\n }\n\n if (this.BITS == null) {\n this.BITS = _.invert(this.MASKS);\n }\n\n if (this.INTERVALS == null) {\n this.INTERVALS = {};\n this.INTERVALS[(1 << this.BITS.YEAR)] = [ 'year' ];\n this.INTERVALS[(1 << this.BITS.MONTH)] = [ 'month' ];\n this.INTERVALS[(1 << this.BITS.DAY)] = [ 'day' ];\n this.INTERVALS[(1 << this.BITS.HOUR)] = [ 'hour' ];\n this.INTERVALS[(1 << this.BITS.MINUTE)] = [ 'minute' ];\n this.INTERVALS[(1 << this.BITS.SECOND)] = [ 'second' ];\n this.INTERVALS[(1 << this.BITS.YEAR | 1 << this.BITS.MONTH)] = [ 'year', 'month' ];\n this.INTERVALS[(1 << this.BITS.DAY | 1 << this.BITS.HOUR)] = [ 'day', 'hour' ];\n this.INTERVALS[(1 << this.BITS.DAY | 1 << this.BITS.HOUR | 1 << this.BITS.MINUTE)] = [ 'day', 'minute' ];\n this.INTERVALS[(1 << this.BITS.DAY | 1 << this.BITS.HOUR | 1 << this.BITS.MINUTE | 1 << this.BITS.SECOND)] = [ 'day', 'second' ];\n this.INTERVALS[(1 << this.BITS.HOUR | 1 << this.BITS.MINUTE)] = [ 'hour', 'minute' ];\n this.INTERVALS[(1 << this.BITS.HOUR | 1 << this.BITS.MINUTE | 1 << this.BITS.SECOND)] = [ 'hour', 'second' ];\n this.INTERVALS[(1 << this.BITS.MINUTE | 1 << this.BITS.SECOND)] = [ 'minute', 'second' ];\n\n // utils/timestamp.h\n // #define INTERVAL_FULL_RANGE (0x7FFF)\n this.INTERVALS[this.INTERVAL_FULL_RANGE = '32767'] = [];\n }\n\n return this.INTERVALS[mask.toString()];\n }\n}\n"]} \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 0fa450c..ac89b12 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":[],"mappings":";;;;;;;AAAA;;AACA;;;;AACA;;;;AAEA,MAAM,UAAU,mBAAS,OAAzB;;AAEA,MAAM,SAAU,KAAD,IAAW;AACxB,QAAM,SAAS,QAAQ,0BAAM,KAAN,EAAa,KAArB,CAAf;;AAEA,QAAM,QAAQ,kBAAM,0BAAM,KAAN,EAAa,KAAnB,CAAd;AACA,QAAM,QAAQ,kBAAM,0BAAM,MAAN,EAAc,KAApB,CAAd;;AAEA,SAAO,KAAK,SAAL,CAAe,KAAf,MAA0B,KAAK,SAAL,CAAe,KAAf,CAAjC;AACD,CAPD;;QASS,K;QAAO,O,GAAA,O;QAAS,I;QAAM,K;QAAO,G;QAAK,M;QAAQ,M;QAAQ,K;QAAO,M,GAAA,M;QAAQ,Q","file":"index.js","sourcesContent":["import { parse } from 'pg-query-native';\nimport Deparser from './deparser';\nimport { walk, all, first, tables, byType, clean } from './utils';\n\nconst deparse = Deparser.deparse;\n\nconst verify = (query) => {\n const result = deparse(parse(query).query);\n\n const json1 = clean(parse(query).query);\n const json2 = clean(parse(result).query);\n\n return JSON.stringify(json1) === JSON.stringify(json2);\n};\n\nexport { parse, deparse, walk, first, all, tables, byType, clean, verify, Deparser };\n"]} \ No newline at end of file +{"version":3,"sources":["../src/index.js"],"names":["deparse","verify","query","result","json1","json2","JSON","stringify","parse","walk","first","all","tables","byType","clean","Deparser"],"mappings":";;;;;;;AAAA;;AACA;;;;AACA;;;;AAEA,MAAMA,UAAU,mBAASA,OAAzB;;AAEA,MAAMC,SAAUC,KAAD,IAAW;AACxB,QAAMC,SAASH,QAAQ,0BAAME,KAAN,EAAaA,KAArB,CAAf;;AAEA,QAAME,QAAQ,kBAAM,0BAAMF,KAAN,EAAaA,KAAnB,CAAd;AACA,QAAMG,QAAQ,kBAAM,0BAAMF,MAAN,EAAcD,KAApB,CAAd;;AAEA,SAAOI,KAAKC,SAAL,CAAeH,KAAf,MAA0BE,KAAKC,SAAL,CAAeF,KAAf,CAAjC;AACD,CAPD;;QASSG,K;QAAOR,O,GAAAA,O;QAASS,I;QAAMC,K;QAAOC,G;QAAKC,M;QAAQC,M;QAAQC,K;QAAOb,M,GAAAA,M;QAAQc,Q","file":"index.js","sourcesContent":["import { parse } from 'pg-query-native';\nimport Deparser from './deparser';\nimport { walk, all, first, tables, byType, clean } from './utils';\n\nconst deparse = Deparser.deparse;\n\nconst verify = (query) => {\n const result = deparse(parse(query).query);\n\n const json1 = clean(parse(query).query);\n const json2 = clean(parse(result).query);\n\n return JSON.stringify(json1) === JSON.stringify(json2);\n};\n\nexport { parse, deparse, walk, first, all, tables, byType, clean, verify, Deparser };\n"]} \ No newline at end of file diff --git a/dist/utils.js.map b/dist/utils.js.map index 4305232..d24c5bc 100644 --- a/dist/utils.js.map +++ b/dist/utils.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/utils.js"],"names":[],"mappings":";;;;;QAIgB,I,GAAA,I;QA0CA,K,GAAA,K;QAUA,G,GAAA,G;QAcA,M,GAAA,M;QAMA,M,GAAA,M;QAMA,K,GAAA,K;;AAlFhB;;;;;;AAEA,MAAM,OAAO,EAAb;;AAEO,SAAS,IAAT,CAAc,GAAd,EAAmB,IAAnB,EAAyB;AAC9B,MAAI,iBAAE,OAAF,CAAU,GAAV,CAAJ,EAAoB;AAClB,SAAK,MAAM,IAAX,IAAmB,GAAnB,EAAwB;AACtB,UAAI,KAAK,GAAL,EAAU,IAAV,MAAoB,IAAxB,EAA8B;AAC5B,eAAO,IAAP;AACD;AACF;;AAED,UAAM,UAAU,EAAhB;;AAEA,SAAK,MAAM,IAAX,IAAmB,GAAnB,EAAwB;AACtB,cAAQ,IAAR,CAAa,KAAK,IAAL,EAAW,IAAX,CAAb;AACD;;AAED,WAAO,OAAP;AACD,GAdD,MAcO,IAAI,iBAAE,QAAF,CAAW,GAAX,CAAJ,EAAqB;AAC1B,SAAK,MAAM,GAAX,IAAkB,OAAO,IAAP,CAAY,GAAZ,CAAlB,EAAoC;AAClC,YAAM,QAAQ,IAAI,GAAJ,CAAd;;AAEA,UAAI,KAAK,GAAL,EAAU,GAAV,EAAe,KAAf,MAA0B,IAA9B,EAAoC;AAClC,eAAO,GAAP;AACD;AACF;;AAED,UAAM,UAAU,EAAhB;;AAEA,SAAK,MAAM,GAAX,IAAkB,OAAO,IAAP,CAAY,GAAZ,CAAlB,EAAoC;AAClC,YAAM,QAAQ,IAAI,GAAJ,CAAd;;AAEA,cAAQ,IAAR,CAAa,KAAK,KAAL,EAAY,IAAZ,CAAb;AACD;;AAED,WAAO,OAAP;AACD;;AAED,MAAI,KAAK,GAAL,MAAc,IAAlB,EAAwB;AACtB,WAAO,GAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAEM,SAAS,KAAT,CAAe,GAAf,EAAoB,IAApB,EAA0B;AAC/B,SAAO,KAAK,GAAL,EAAU,CAAC,MAAD,EAAS,GAAT,EAAc,KAAd,KAAwB;AACvC,QAAI,KAAK,MAAL,EAAa,GAAb,EAAkB,KAAlB,CAAJ,EAA8B;AAC5B,aAAO,IAAP;AACD;;AAED,WAAO,IAAP;AACD,GANM,CAAP;AAOD;;AAEM,SAAS,GAAT,CAAa,GAAb,EAAkB,IAAlB,EAAwB;AAC7B,QAAM,UAAU,EAAhB;;AAEA,OAAK,GAAL,EAAU,CAAC,MAAD,EAAS,GAAT,EAAc,KAAd,KAAwB;AAChC,QAAI,KAAK,MAAL,EAAa,GAAb,EAAkB,KAAlB,CAAJ,EAA8B;AAC5B,aAAO,QAAQ,IAAR,CAAa,MAAb,CAAP;AACD;;AAED,WAAO,IAAP;AACD,GAND;;AAQA,SAAO,OAAP;AACD;;AAEM,SAAS,MAAT,CAAgB,KAAhB,EAAuB;AAC5B,SAAO,IAAI,KAAJ,EAAW,CAAC,GAAD,EAAM,GAAN,EAAW,KAAX,KAAqB;AACrC,WAAO,QAAQ,UAAf;AACD,GAFM,CAAP;AAGD;;AAEM,SAAS,MAAT,CAAgB,KAAhB,EAAuB,IAAvB,EAA6B;AAClC,SAAO,IAAI,KAAJ,EAAW,CAAC,MAAD,EAAS,GAAT,EAAc,KAAd,KAAwB;AACxC,WAAO,QAAQ,IAAf;AACD,GAFM,CAAP;AAGD;;AAEM,SAAS,KAAT,CAAe,IAAf,EAAqB;AAC1B,OAAK,IAAL,EAAW,CAAC,MAAD,EAAS,GAAT,EAAc,KAAd,KAAwB;AACjC,QAAI,iBAAE,OAAF,CAAU,MAAV,CAAJ,EAAuB;AACrB;AACD;;AAED,QAAI,QAAQ,UAAZ,EAAwB;AACtB,aAAO,OAAO,QAAd;AACD;AACF,GARD;;AAUA,SAAO,IAAP;AACD","file":"utils.js","sourcesContent":["import _ from 'lodash';\n\nconst EXIT = {};\n\nexport function walk(obj, func) {\n if (_.isArray(obj)) {\n for (const item of obj) {\n if (func(obj, item) === EXIT) {\n return item;\n }\n }\n\n const results = [];\n\n for (const item of obj) {\n results.push(walk(item, func));\n }\n\n return results;\n } else if (_.isObject(obj)) {\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n\n if (func(obj, key, value) === EXIT) {\n return obj;\n }\n }\n\n const results = [];\n\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n\n results.push(walk(value, func));\n }\n\n return results;\n }\n\n if (func(obj) === EXIT) {\n return obj;\n }\n\n return null;\n}\n\nexport function first(obj, func) {\n return walk(obj, (object, key, value) => {\n if (func(object, key, value)) {\n return EXIT;\n }\n\n return null;\n });\n}\n\nexport function all(obj, func) {\n const results = [];\n\n walk(obj, (object, key, value) => {\n if (func(object, key, value)) {\n return results.push(object);\n }\n\n return null;\n });\n\n return results;\n}\n\nexport function tables(query) {\n return all(query, (obj, key, value) => {\n return key === 'RangeVar';\n });\n}\n\nexport function byType(query, type) {\n return all(query, (object, key, value) => {\n return key === type;\n });\n}\n\nexport function clean(tree) {\n walk(tree, (object, key, value) => {\n if (_.isArray(object)) {\n return;\n }\n\n if (key === 'location') {\n delete object.location;\n }\n });\n\n return tree;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/utils.js"],"names":["walk","first","all","tables","byType","clean","EXIT","obj","func","isArray","item","results","push","isObject","key","Object","keys","value","object","query","type","tree","location"],"mappings":"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","file":"utils.js","sourcesContent":["import _ from 'lodash';\n\nconst EXIT = {};\n\nexport function walk(obj, func) {\n if (_.isArray(obj)) {\n for (const item of obj) {\n if (func(obj, item) === EXIT) {\n return item;\n }\n }\n\n const results = [];\n\n for (const item of obj) {\n results.push(walk(item, func));\n }\n\n return results;\n } else if (_.isObject(obj)) {\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n\n if (func(obj, key, value) === EXIT) {\n return obj;\n }\n }\n\n const results = [];\n\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n\n results.push(walk(value, func));\n }\n\n return results;\n }\n\n if (func(obj) === EXIT) {\n return obj;\n }\n\n return null;\n}\n\nexport function first(obj, func) {\n return walk(obj, (object, key, value) => {\n if (func(object, key, value)) {\n return EXIT;\n }\n\n return null;\n });\n}\n\nexport function all(obj, func) {\n const results = [];\n\n walk(obj, (object, key, value) => {\n if (func(object, key, value)) {\n return results.push(object);\n }\n\n return null;\n });\n\n return results;\n}\n\nexport function tables(query) {\n return all(query, (obj, key, value) => {\n return key === 'RangeVar';\n });\n}\n\nexport function byType(query, type) {\n return all(query, (object, key, value) => {\n return key === type;\n });\n}\n\nexport function clean(tree) {\n walk(tree, (object, key, value) => {\n if (_.isArray(object)) {\n return;\n }\n\n if (key === 'location') {\n delete object.location;\n }\n });\n\n return tree;\n}\n"]} \ No newline at end of file diff --git a/package.json b/package.json index ec4c1ce..9c1e04f 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,10 @@ "homepage": "http://github.com/zhm/pg-query-parser", "main": "dist/index.js", "scripts": { - "test": "./node_modules/.bin/mocha --reporter dot test/setup.js test/test.js", - "simpletest": "node_modules/.bin/mocha ./test/setup.js ./test/test.js ./test/elements/*.js", + "test": + "./node_modules/.bin/mocha --reporter dot test/setup.js test/test.js", + "simpletest": + "node_modules/.bin/mocha ./test/setup.js ./test/test.js ./test/elements/*.js", "prepublish": "npm run lint && npm run clean && npm run build", "lint": "node_modules/.bin/eslint src/* src/**/*", "build": "node_modules/.bin/babel src --out-dir dist --source-maps", @@ -25,19 +27,19 @@ "extends": "fulcrum" }, "devDependencies": { - "babel-cli": "^6.9.0", - "babel-core": "^6.9.1", - "babel-eslint": "^6.0.4", + "babel-cli": "^6.26.0", + "babel-core": "^6.26.0", + "babel-eslint": "^8.2.2", "babel-preset-es2015-node5": "^1.2.0", "babel-preset-stage-1": "^6.5.0", "browserify": "^13.0.1", "chai": "^3.5.0", "coffee-script": "^1.10.0", "coffeeify": "^2.0.1", - "eslint": "^2.11.1", - "eslint-config-fulcrum": "^1.0.2", - "eslint-plugin-babel": "^3.3.0", - "eslint-plugin-react": "^5.1.1", + "eslint": "^4.18.1", + "eslint-config-fulcrum": "^1.5.4", + "eslint-plugin-babel": "^4.1.2", + "eslint-plugin-react": "^7.7.0", "glob": "^7.0.3", "mocha": "^2.5.3", "npm-check-updates": "^2.6.5", @@ -50,12 +52,5 @@ "lodash": "^4.13.1", "pg-query-native": "^1.1.0" }, - "keywords": [ - "sql", - "postgres", - "postgresql", - "pg", - "query", - "database" - ] + "keywords": ["sql", "postgres", "postgresql", "pg", "query", "database"] } diff --git a/src/deparser.js b/src/deparser.js index 847a55a..dcbda8c 100644 --- a/src/deparser.js +++ b/src/deparser.js @@ -1,6 +1,17 @@ import _ from 'lodash'; import { format } from 'util'; +const CONSTRAINT_TYPES = [ + 'NULL', + 'NOT NULL', + 'DEFAULT', + 'CHECK', + 'PRIMARY KEY', + 'UNIQUE', + 'EXCLUDE', + 'REFERENCES' +]; + const { keys } = _; const compact = o => { @@ -624,8 +635,7 @@ export default class Deparser { } const wrapped = - (node.rarg.JoinExpr != null) || node.alias ? '(' + output.join(' ') + ')' - : output.join(' '); + (node.rarg.JoinExpr != null) || node.alias ? '(' + output.join(' ') + ')' : output.join(' '); if (node.alias) { return wrapped + ' ' + this.deparse(node.alias); @@ -961,6 +971,247 @@ export default class Deparser { return output.join(' '); } + ['CreateStmt'](node) { + const output = []; + output.push('CREATE TABLE'); + output.push(this.deparse(node.relation)); + output.push('('); + output.push(this.list(node.tableElts)); + output.push(')'); + output.push(';'); + return output.join(' '); + } + + ['ConstraintStmt'](node) { + const output = []; + const constraint = CONSTRAINT_TYPES[node.contype]; + + if (node.conname) { + output.push(`CONSTRAINT ${node.conname} ${constraint}`); + } else { + output.push(constraint); + } + + return output.join(' '); + } + + ['ReferenceConstraint'](node) { + const output = []; + if (node.pk_attrs && node.fk_attrs) { + output.push('FOREIGN KEY'); + output.push('('); + output.push(this.list(node.fk_attrs)); + output.push(')'); + output.push('REFERENCES'); + output.push(this.deparse(node.pktable)); + output.push('('); + output.push(this.list(node.pk_attrs)); + output.push(')'); + } else if (node.pk_attrs) { + output.push(this.ConstraintStmt(node)); + output.push(this.deparse(node.pktable)); + output.push('('); + output.push(this.list(node.pk_attrs)); + output.push(')'); + } else { + output.push(this.ConstraintStmt(node)); + output.push(this.deparse(node.pktable)); + } + return output.join(' '); + } + + ['ExclusionConstraint'](node) { + const output = []; + function getExclusionGroup(nde) { + const out = []; + const a = nde.exclusions.map(excl => { + if (excl[0].IndexElem.name) { + return excl[0].IndexElem.name; + } + return excl[0].IndexElem.expr ? this.deparse(excl[0].IndexElem.expr) : null; + }); + + const b = nde.exclusions.map(excl => this.deparse(excl[1][0])); + + for (let i = 0; i < a.length; i++) { + out.push(`${a[i]} WITH ${b[i]}`); + if (i !== a.length - 1) { + out.push(','); + } + } + + return out.join(' '); + } + + if (node.exclusions && node.access_method) { + output.push('USING'); + output.push(node.access_method); + output.push('('); + output.push(getExclusionGroup.call(this, node)); + output.push(')'); + } + + return output.join(' '); + } + + ['Constraint'](node) { + const output = []; + + const constraint = CONSTRAINT_TYPES[node.contype]; + if (!constraint) { + throw new Error('type not implemented: ' + node.contype); + } + + if (constraint === 'REFERENCES') { + output.push(this.ReferenceConstraint(node)); + } else { + output.push(this.ConstraintStmt(node)); + } + + if (node.keys) { + output.push('('); + output.push(this.list(node.keys)); + output.push(')'); + } + + if (node.raw_expr) { + output.push(this.deparse(node.raw_expr)); + } + + if (node.fk_del_action) { + switch (node.fk_del_action) { + case 'r': + output.push('ON DELETE RESTRICT'); + break; + case 'c': + output.push('ON DELETE CASCADE'); + break; + default: + } + } + + if (node.fk_upd_action) { + switch (node.fk_upd_action) { + case 'r': + output.push('ON UPDATE RESTRICT'); + break; + case 'c': + output.push('ON UPDATE CASCADE'); + break; + default: + } + } + + if (constraint === 'EXCLUDE') { + output.push(this.ExclusionConstraint(node)); + } + + return output.join(' '); + } + + ['FunctionParameter'](node) { + const output = []; + + output.push(node.name); + output.push(this.deparse(node.argType)); + + return output.join(' '); + } + + ['CreateFunctionStmt'](node) { + const output = []; + + output.push('CREATE'); + if (node.replace) { + output.push('OR REPLACE'); + } + output.push('FUNCTION'); + + output.push(node.funcname.map(name => this.deparse(name)).join('.')); + output.push('('); + output.push( + node.parameters + .filter(({ FunctionParameter }) => FunctionParameter.mode === 105) + .map(param => this.deparse(param)) + .join(', ') + ); + output.push(')'); + + const returns = node.parameters.filter( + ({ FunctionParameter }) => FunctionParameter.mode === 116 + ); + // var setof = node.parameters.filter( + // ({ FunctionParameter }) => FunctionParameter.mode === 109 + // ); + + output.push('RETURNS'); + if (returns.length) { + output.push('TABLE'); + output.push('('); + output.push( + node.parameters + .filter(({ FunctionParameter }) => FunctionParameter.mode === 116) + .map(param => this.deparse(param)) + .join(', ') + ); + output.push(')'); + } else { + output.push(this.deparse(node.returnType)); + } + + const elems = {}; + + node.options.forEach(option => { + if (option && option.DefElem) { + switch (option.DefElem.defname) { + case 'as': + elems.as = option; + break; + + case 'language': + elems.language = option; + break; + + case 'volatility': + elems.volatility = option; + break; + default: + } + } + }); + + output.push(` +AS $$${this.deparse(elems.as.DefElem.arg[0])}$$ +LANGUAGE '${this.deparse(elems.language.DefElem.arg)}' ${this.deparse(elems.volatility.DefElem.arg).toUpperCase()}; +`); + + return output.join(' '); + } + ['CreateSchemaStmt'](node) { + const output = []; + + output.push('CREATE'); + if (node.replace) { + output.push('OR REPLACE'); + } + output.push('SCHEMA'); + output.push(node.schemaname); + return output.join(' '); + } + + ['TransactionStmt'](node) { + switch (node.kind) { + case 0: + return 'BEGIN'; + case 1: + break; + case 2: + return 'COMMIT'; + default: + } + return ''; + } + ['SortBy'](node) { const output = []; @@ -1299,13 +1550,13 @@ export default class Deparser { this.INTERVALS[(1 << this.BITS.HOUR)] = [ 'hour' ]; this.INTERVALS[(1 << this.BITS.MINUTE)] = [ 'minute' ]; this.INTERVALS[(1 << this.BITS.SECOND)] = [ 'second' ]; - this.INTERVALS[(1 << this.BITS.YEAR | 1 << this.BITS.MONTH)] = [ 'year', 'month' ]; - this.INTERVALS[(1 << this.BITS.DAY | 1 << this.BITS.HOUR)] = [ 'day', 'hour' ]; - this.INTERVALS[(1 << this.BITS.DAY | 1 << this.BITS.HOUR | 1 << this.BITS.MINUTE)] = [ 'day', 'minute' ]; - this.INTERVALS[(1 << this.BITS.DAY | 1 << this.BITS.HOUR | 1 << this.BITS.MINUTE | 1 << this.BITS.SECOND)] = [ 'day', 'second' ]; - this.INTERVALS[(1 << this.BITS.HOUR | 1 << this.BITS.MINUTE)] = [ 'hour', 'minute' ]; - this.INTERVALS[(1 << this.BITS.HOUR | 1 << this.BITS.MINUTE | 1 << this.BITS.SECOND)] = [ 'hour', 'second' ]; - this.INTERVALS[(1 << this.BITS.MINUTE | 1 << this.BITS.SECOND)] = [ 'minute', 'second' ]; + this.INTERVALS[((1 << this.BITS.YEAR) | (1 << this.BITS.MONTH))] = [ 'year', 'month' ]; + this.INTERVALS[((1 << this.BITS.DAY) | (1 << this.BITS.HOUR))] = [ 'day', 'hour' ]; + this.INTERVALS[((1 << this.BITS.DAY) | (1 << this.BITS.HOUR) | (1 << this.BITS.MINUTE))] = [ 'day', 'minute' ]; + this.INTERVALS[((1 << this.BITS.DAY) | (1 << this.BITS.HOUR) | (1 << this.BITS.MINUTE) | (1 << this.BITS.SECOND))] = [ 'day', 'second' ]; + this.INTERVALS[((1 << this.BITS.HOUR) | (1 << this.BITS.MINUTE))] = [ 'hour', 'minute' ]; + this.INTERVALS[((1 << this.BITS.HOUR) | (1 << this.BITS.MINUTE) | (1 << this.BITS.SECOND))] = [ 'hour', 'second' ]; + this.INTERVALS[((1 << this.BITS.MINUTE) | (1 << this.BITS.SECOND))] = [ 'minute', 'second' ]; // utils/timestamp.h // #define INTERVAL_FULL_RANGE (0x7FFF) diff --git a/test/fixtures/create/check.sql b/test/fixtures/create/check.sql new file mode 100644 index 0000000..774a88e --- /dev/null +++ b/test/fixtures/create/check.sql @@ -0,0 +1,17 @@ +CREATE TABLE products ( + product_no integer, + name text, + price numeric CHECK (price > 0) +); +CREATE TABLE products ( + product_no integer, + name text, + price numeric CONSTRAINT positive_price CHECK (price > 0) +); +CREATE TABLE products ( + product_no integer, + name text, + price numeric CHECK (price > 0), + discounted_price numeric CHECK (discounted_price > 0), + CHECK (price > discounted_price) +); diff --git a/test/fixtures/create/defaults.sql b/test/fixtures/create/defaults.sql new file mode 100644 index 0000000..5e76f8b --- /dev/null +++ b/test/fixtures/create/defaults.sql @@ -0,0 +1,5 @@ +CREATE TABLE "customer_product_categories" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL, + "effective" tstzrange DEFAULT '[-infinity,infinity]' +) diff --git a/test/fixtures/create/exclude.sql b/test/fixtures/create/exclude.sql new file mode 100644 index 0000000..fc48286 --- /dev/null +++ b/test/fixtures/create/exclude.sql @@ -0,0 +1,10 @@ +CREATE TABLE circles ( + c circle, + EXCLUDE USING gist (c WITH &&) +); +CREATE TABLE "customer_product_categories" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL, + "effective" tstzrange DEFAULT '[-infinity,infinity]', + EXCLUDE USING gist (LOWER("name") WITH =, "effective" WITH &&) +) diff --git a/test/fixtures/create/foreign.sql b/test/fixtures/create/foreign.sql new file mode 100644 index 0000000..61881c8 --- /dev/null +++ b/test/fixtures/create/foreign.sql @@ -0,0 +1,31 @@ +CREATE TABLE orders ( + order_id integer PRIMARY KEY, + product_no integer REFERENCES products (product_no), + quantity integer +); +CREATE TABLE orders ( + order_id integer PRIMARY KEY, + product_no integer REFERENCES products, + quantity integer +); +CREATE TABLE t1 ( + a integer PRIMARY KEY, + b integer, + c integer, + FOREIGN KEY (b, c) REFERENCES other_table (c1, c2) +); +CREATE TABLE products ( + product_no integer PRIMARY KEY, + name text, + price numeric +); +CREATE TABLE orders ( + order_id integer PRIMARY KEY, + shipping_address text +); +CREATE TABLE order_items ( + product_no integer REFERENCES products, + order_id integer REFERENCES orders, + quantity integer, + PRIMARY KEY (product_no, order_id) +); diff --git a/test/fixtures/create/nulls.sql b/test/fixtures/create/nulls.sql new file mode 100644 index 0000000..afb7f27 --- /dev/null +++ b/test/fixtures/create/nulls.sql @@ -0,0 +1,15 @@ +CREATE TABLE products ( + product_no integer NOT NULL, + name text NOT NULL, + price numeric +); +CREATE TABLE products ( + product_no integer NULL, + name text NULL, + price numeric NULL +); +CREATE TABLE products ( + product_no integer NOT NULL, + name text NOT NULL, + price numeric NOT NULL CHECK (price > 0) +); diff --git a/test/fixtures/create/on_delete.sql b/test/fixtures/create/on_delete.sql new file mode 100644 index 0000000..e9c09f0 --- /dev/null +++ b/test/fixtures/create/on_delete.sql @@ -0,0 +1,6 @@ +CREATE TABLE order_items ( + product_no integer REFERENCES products ON DELETE RESTRICT, + order_id integer REFERENCES orders ON DELETE CASCADE, + quantity integer, + PRIMARY KEY (product_no, order_id) +); diff --git a/test/fixtures/create/on_update.sql b/test/fixtures/create/on_update.sql new file mode 100644 index 0000000..b0331e7 --- /dev/null +++ b/test/fixtures/create/on_update.sql @@ -0,0 +1,6 @@ +CREATE TABLE order_items ( + product_no integer REFERENCES products ON UPDATE RESTRICT, + order_id integer REFERENCES orders ON UPDATE CASCADE, + quantity integer, + PRIMARY KEY (product_no, order_id) +); diff --git a/test/fixtures/create/unique.sql b/test/fixtures/create/unique.sql new file mode 100644 index 0000000..e534256 --- /dev/null +++ b/test/fixtures/create/unique.sql @@ -0,0 +1,22 @@ +CREATE TABLE products ( + product_no integer UNIQUE, + name text, + price numeric +); +CREATE TABLE products ( + product_no integer, + name text, + price numeric, + UNIQUE (product_no) +); +CREATE TABLE example ( + a integer, + b integer, + c integer, + UNIQUE (a, c) +); +CREATE TABLE products ( + product_no integer CONSTRAINT must_be_different UNIQUE, + name text, + price numeric +); diff --git a/test/fixtures/functions/basic.sql b/test/fixtures/functions/basic.sql new file mode 100644 index 0000000..37178f8 --- /dev/null +++ b/test/fixtures/functions/basic.sql @@ -0,0 +1,21 @@ +CREATE OR REPLACE FUNCTION someschema.myfunc (some_id uuid, other_id uuid) RETURNS void +AS $$ +UPDATE + mytable +SET + ref_id = new_ref_id +WHERE + id = some_id +$$ +LANGUAGE 'sql' VOLATILE; + +CREATE OR REPLACE FUNCTION someschema.myfunc (some_id uuid, other_id uuid) RETURNS obj.geo +AS $$ +UPDATE + mytable +SET + ref_id = new_ref_id +WHERE + id = some_id +$$ +LANGUAGE 'sql' VOLATILE; diff --git a/test/fixtures/functions/returns_table.sql b/test/fixtures/functions/returns_table.sql new file mode 100644 index 0000000..aaf818d --- /dev/null +++ b/test/fixtures/functions/returns_table.sql @@ -0,0 +1,6 @@ +CREATE OR REPLACE FUNCTION someschema.myfunc (some_id obj.geo_type, other_id obj.geo_type) RETURNS TABLE (path text, name integer) +AS $$ +SELECT * FROM + mytable +$$ +LANGUAGE 'sql' VOLATILE; diff --git a/test/fixtures/functions/returns_trigger.sql b/test/fixtures/functions/returns_trigger.sql new file mode 100644 index 0000000..4717baa --- /dev/null +++ b/test/fixtures/functions/returns_trigger.sql @@ -0,0 +1,11 @@ +CREATE OR REPLACE FUNCTION helpers.some_method () + RETURNS TRIGGER +AS $$ +BEGIN + IF tg_op = 'INSERT' THEN + NEW.some_prop = helpers.do_magic (NEW.data); + RETURN NEW; + END IF; +END; +$$ +LANGUAGE 'plpgsql'; diff --git a/test/fixtures/functions/setof.sql b/test/fixtures/functions/setof.sql new file mode 100644 index 0000000..56d7204 --- /dev/null +++ b/test/fixtures/functions/setof.sql @@ -0,0 +1,21 @@ +CREATE OR REPLACE FUNCTION someschema.myfunc (some_id uuid, other_id uuid) RETURNS SETOF obj.geo +AS $$ +UPDATE + mytable +SET + ref_id = new_ref_id +WHERE + id = some_id +$$ +LANGUAGE 'sql' VOLATILE; + +CREATE OR REPLACE FUNCTION someschema.myfunc (some_id obj.geo_type, other_id obj.geo_type) RETURNS SETOF obj.geo +AS $$ +UPDATE + mytable +SET + ref_id = new_ref_id +WHERE + id = some_id +$$ +LANGUAGE 'sql' VOLATILE; diff --git a/test/fixtures/transactions/begin_commit.sql b/test/fixtures/transactions/begin_commit.sql new file mode 100644 index 0000000..e43347c --- /dev/null +++ b/test/fixtures/transactions/begin_commit.sql @@ -0,0 +1,6 @@ +BEGIN; +CREATE TABLE products ( + product_no integer, + name text +); +COMMIT; diff --git a/test/test.js b/test/test.js index 9e18f61..1cac94b 100644 --- a/test/test.js +++ b/test/test.js @@ -1,15 +1,31 @@ import chai from 'chai'; import fs from 'fs'; -import glob from 'glob'; +import { sync as glob } from 'glob'; chai.should(); import { deparse, parse, clean, byType } from '../src'; +const supportedStatements = [ + 'SelectStmt' + // 'CreateFunctionStmt', + // 'CreateStmt', + // 'TransactionStmt' +]; + +const isSupported = node => { + for (var i = 0; i < supportedStatements.length; i++) { + if (node[supportedStatements[i]] != null) return true; + } +}; + const pattern = process.env.FILTER ? `*${process.env.FILTER}*.sql` : '*.sql'; -let files = glob.sync(`./test/fixtures/${pattern}`); -files = files.concat(glob.sync(`./test/fixtures/upstream/${pattern}`)); +let files = glob(`./test/fixtures/${pattern}`) + .concat(glob(`./test/fixtures/create/${pattern}`)) + .concat(glob(`./test/fixtures/functions/${pattern}`)) + .concat(glob(`./test/fixtures/tranactions/${pattern}`)) + .concat(glob(`./test/fixtures/upstream/${pattern}`)); const log = (msg) => { fs.writeSync(1, `${msg}\n`); @@ -41,7 +57,7 @@ const defineQueryTest = (sqlQuery, file) => { parsed = parse(sqlQuery); // Only SelectStmt's for now - if (parsed.query && parsed.query[0] && (parsed.query[0].SelectStmt != null)) { + if (parsed.query && parsed.query[0] && isSupported(parsed.query[0])) { check(sqlQuery); } } catch (ex) {