pgsql-deparser 13.3.14 → 13.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/main/deparser.js CHANGED
@@ -1,52 +1,29 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports["default"] = void 0;
9
-
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
-
12
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
-
14
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
-
16
8
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
17
-
18
9
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
19
-
20
10
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
21
-
22
- var _lodash = _interopRequireDefault(require("lodash"));
23
-
24
11
  var _util = require("util");
25
-
26
12
  var _pgsqlEnums = require("pgsql-enums");
27
-
28
- var _preparse = require("./preparse");
29
-
30
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
31
-
32
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
33
-
34
13
  var TAB_CHAR = '\t';
35
14
  var NEWLINE_CHAR = '\n';
36
-
37
15
  var isEmptyObject = function isEmptyObject(obj) {
38
16
  return !obj || (0, _typeof2["default"])(obj) === 'object' && !Object.keys(obj).length;
39
17
  };
40
-
41
18
  var dotty = require('dotty');
42
-
43
19
  var fail = function fail(type, node) {
44
20
  throw new Error((0, _util.format)('Unhandled %s node: %s', type, JSON.stringify(node)));
45
- }; // select word from pg_get_keywords() where catcode = 'R';
46
-
21
+ };
47
22
 
48
- var RESERVED_WORDS = ['all', 'analyse', 'analyze', 'and', 'any', 'array', 'as', 'asc', 'asymmetric', 'both', 'case', 'cast', 'check', 'collate', 'column', 'constraint', 'create', 'current_catalog', 'current_date', 'current_role', 'current_time', 'current_timestamp', 'current_user', 'default', 'deferrable', 'desc', 'distinct', 'do', 'else', 'end', 'except', 'false', 'fetch', 'for', 'foreign', 'from', 'grant', 'group', 'having', 'in', 'initially', 'intersect', 'into', 'lateral', 'leading', 'limit', 'localtime', 'localtimestamp', 'not', 'null', 'offset', 'on', 'only', 'or', 'order', 'placing', 'primary', 'references', 'returning', 'select', 'session_user', 'some', 'symmetric', 'table', 'then', 'to', 'trailing', 'true', 'union', 'unique', 'user', 'using', 'variadic', 'when', 'where', 'window', 'with']; // https://github.com/pganalyze/libpg_query/blob/b2790f8140721ff7f047167ecd7d44267b0a3880/src/postgres/include/storage/lockdefs.h
23
+ // select word from pg_get_keywords() where catcode = 'R';
24
+ var RESERVED_WORDS = new Set(['all', 'analyse', 'analyze', 'and', 'any', 'array', 'as', 'asc', 'asymmetric', 'both', 'case', 'cast', 'check', 'collate', 'column', 'constraint', 'create', 'current_catalog', 'current_date', 'current_role', 'current_time', 'current_timestamp', 'current_user', 'default', 'deferrable', 'desc', 'distinct', 'do', 'else', 'end', 'except', 'false', 'fetch', 'for', 'foreign', 'from', 'grant', 'group', 'having', 'in', 'initially', 'intersect', 'into', 'lateral', 'leading', 'limit', 'localtime', 'localtimestamp', 'not', 'null', 'offset', 'on', 'only', 'or', 'order', 'placing', 'primary', 'references', 'returning', 'select', 'session_user', 'some', 'symmetric', 'table', 'then', 'to', 'trailing', 'true', 'union', 'unique', 'user', 'using', 'variadic', 'when', 'where', 'window', 'with']);
49
25
 
26
+ // https://github.com/pganalyze/libpg_query/blob/b2790f8140721ff7f047167ecd7d44267b0a3880/src/postgres/include/storage/lockdefs.h
50
27
  var LOCK_MODES = {
51
28
  1: 'ACCESS SHARE',
52
29
  2: 'ROW SHARE',
@@ -57,60 +34,73 @@ var LOCK_MODES = {
57
34
  7: 'EXCLUSIVE',
58
35
  8: 'ACCESS EXCLUSIVE'
59
36
  };
60
-
61
37
  var isReserved = function isReserved(value) {
62
- return RESERVED_WORDS.includes(value.toLowerCase());
63
- }; // usually the AST lowercases all the things, so if we
64
- // have both, the author most likely used double quotes
38
+ return RESERVED_WORDS.has(value.toLowerCase());
39
+ };
65
40
 
41
+ // has uppercase and lowercase, or non word characters
42
+ var needsQuotesRegex = /[a-z]+[\W\w]*[A-Z]+|[A-Z]+[\W\w]*[a-z]+|\W/;
66
43
 
44
+ // usually the AST lowercases all the things, so if we
45
+ // have both, the author most likely used double quotes
67
46
  var needsQuotes = function needsQuotes(value) {
68
- return value.match(/[a-z]+[\W\w]*[A-Z]+|[A-Z]+[\W\w]*[a-z]+/) || value.match(/\W/) || isReserved(value);
47
+ return needsQuotesRegex.test(value) || isReserved(value);
69
48
  };
70
-
71
- var keys = _lodash["default"].keys;
72
-
73
49
  var compact = function compact(o) {
74
- return _lodash["default"].filter(_lodash["default"].compact(o), function (p) {
75
- if (p == null) {
76
- return false;
77
- }
78
-
79
- return p.toString().length;
50
+ return o.filter(function (e) {
51
+ var isFalsy = !e;
52
+ return !isFalsy && e.toString().length;
80
53
  });
81
54
  };
82
-
55
+ var flatten = function flatten(o) {
56
+ var flattened = [];
57
+ for (var i = 0; i < o.length; i++) {
58
+ if (Array.isArray(o[i])) {
59
+ for (var j = 0; j < o[i].length; j++) {
60
+ flattened.push(o[i][j]);
61
+ }
62
+ } else {
63
+ flattened.push(o[i]);
64
+ }
65
+ }
66
+ return flattened;
67
+ };
68
+ var inverted = function inverted(o) {
69
+ var objInverted = {};
70
+ var keys = Object.keys(o);
71
+ for (var i = 0; i < keys.length; i++) {
72
+ var key = keys[i];
73
+ objInverted[o[key]] = key;
74
+ }
75
+ return objInverted;
76
+ };
83
77
  var parens = function parens(string) {
84
78
  return '(' + string + ')';
85
79
  };
86
-
87
80
  var indent = function indent(text) {
88
81
  var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
89
82
  return text;
90
83
  };
91
-
84
+ var unwrapList = function unwrapList(obj) {
85
+ return obj !== undefined && obj.List !== undefined ? obj.List.items : obj;
86
+ };
92
87
  var Deparser = /*#__PURE__*/function () {
93
88
  function Deparser(tree) {
94
89
  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
95
90
  (0, _classCallCheck2["default"])(this, Deparser);
96
- this.tree = (0, _preparse.preparse)(tree);
97
-
91
+ this.tree = tree;
98
92
  if (opts.hasOwnProperty('newline')) {
99
93
  NEWLINE_CHAR = opts.newline;
100
94
  }
101
-
102
95
  if (opts.hasOwnProperty('tab')) {
103
96
  TAB_CHAR = opts.tab;
104
97
  }
105
-
106
- if (!_lodash["default"].isArray(this.tree)) this.tree = [this.tree];
98
+ if (!Array.isArray(this.tree)) this.tree = [this.tree];
107
99
  }
108
-
109
100
  (0, _createClass2["default"])(Deparser, [{
110
101
  key: "deparseQuery",
111
102
  value: function deparseQuery() {
112
103
  var _this = this;
113
-
114
104
  return this.tree.map(function (node) {
115
105
  return _this.deparse(node);
116
106
  }).join(NEWLINE_CHAR + NEWLINE_CHAR);
@@ -119,17 +109,16 @@ var Deparser = /*#__PURE__*/function () {
119
109
  key: "deparseNodes",
120
110
  value: function deparseNodes(nodes, context) {
121
111
  var _this2 = this;
122
-
123
- return nodes.map(function (node) {
124
- return _lodash["default"].isArray(node) ? _this2.list(node, ', ', '', context) : _this2.deparse(node, context);
112
+ return unwrapList(nodes).map(function (node) {
113
+ var unwrapped = unwrapList(node);
114
+ return Array.isArray(unwrapped) ? _this2.list(unwrapped, ', ', '', context) : _this2.deparse(node, context);
125
115
  });
126
116
  }
127
117
  }, {
128
118
  key: "deparseReturningList",
129
119
  value: function deparseReturningList(list, context) {
130
120
  var _this3 = this;
131
-
132
- return list.map(function (returning) {
121
+ return unwrapList(list).map(function (returning) {
133
122
  return _this3.deparse(returning.ResTarget.val, context) + (returning.ResTarget.name ? ' AS ' + _this3.quote(returning.ResTarget.name) : '');
134
123
  }).join(',');
135
124
  }
@@ -139,11 +128,9 @@ var Deparser = /*#__PURE__*/function () {
139
128
  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ', ';
140
129
  var prefix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
141
130
  var context = arguments.length > 3 ? arguments[3] : undefined;
142
-
143
131
  if (!nodes) {
144
132
  return '';
145
133
  }
146
-
147
134
  return this.deparseNodes(nodes, context).map(function (l) {
148
135
  return "".concat(prefix).concat(l);
149
136
  }).join(separator);
@@ -152,9 +139,8 @@ var Deparser = /*#__PURE__*/function () {
152
139
  key: "listQuotes",
153
140
  value: function listQuotes(nodes) {
154
141
  var _this4 = this;
155
-
156
142
  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ', ';
157
- return this.list(nodes, separator).split(separator).map(function (a) {
143
+ return this.list(unwrapList(nodes), separator).split(separator).map(function (a) {
158
144
  return _this4.quote(a.trim());
159
145
  }).join(separator);
160
146
  }
@@ -162,24 +148,22 @@ var Deparser = /*#__PURE__*/function () {
162
148
  key: "quote",
163
149
  value: function quote(value) {
164
150
  var _this5 = this;
165
-
166
151
  if (value == null) {
167
152
  return null;
168
153
  }
169
-
170
- if (_lodash["default"].isArray(value)) {
171
- return value.map(function (o) {
154
+ var unwrapped = unwrapList(value);
155
+ if (Array.isArray(unwrapped)) {
156
+ return unwrapped.map(function (o) {
172
157
  return _this5.quote(o);
173
158
  });
174
159
  }
175
-
176
160
  if (needsQuotes(value)) {
177
161
  return '"' + value + '"';
178
162
  }
179
-
180
163
  return value;
181
- } // SELECT encode(E'''123\\000\\001', 'base64')
164
+ }
182
165
 
166
+ // SELECT encode(E'''123\\000\\001', 'base64')
183
167
  }, {
184
168
  key: "escape",
185
169
  value: function escape(literal) {
@@ -192,45 +176,32 @@ var Deparser = /*#__PURE__*/function () {
192
176
  case 'bpchar':
193
177
  if (size != null) {
194
178
  return 'char';
195
- } // return `pg_catalog.bpchar` below so that the following is symmetric
179
+ }
180
+ // return `pg_catalog.bpchar` below so that the following is symmetric
196
181
  // SELECT char 'c' = char 'c' AS true
197
-
198
-
199
182
  return 'pg_catalog.bpchar';
200
-
201
183
  case 'varchar':
202
184
  return 'varchar';
203
-
204
185
  case 'numeric':
205
186
  return 'numeric';
206
-
207
187
  case 'bool':
208
188
  return 'boolean';
209
-
210
189
  case 'int2':
211
190
  return 'smallint';
212
-
213
191
  case 'int4':
214
192
  return 'int';
215
-
216
193
  case 'int8':
217
194
  return 'bigint';
218
-
219
195
  case 'real':
220
196
  return 'pg_catalog.float4';
221
-
222
197
  case 'time':
223
198
  return 'time';
224
-
225
199
  case 'timestamp':
226
200
  return 'timestamp';
227
-
228
201
  case 'interval':
229
202
  return 'interval';
230
-
231
203
  case 'bit':
232
204
  return 'bit';
233
-
234
205
  default:
235
206
  return 'pg_catalog.' + typeName;
236
207
  }
@@ -239,35 +210,28 @@ var Deparser = /*#__PURE__*/function () {
239
210
  key: "type",
240
211
  value: function type(names, args) {
241
212
  var _this6 = this;
242
-
243
- var _names$map = names.map(function (name) {
213
+ var catalogAndType = unwrapList(names).map(function (name) {
244
214
  return _this6.deparse(name);
245
- }),
246
- _names$map2 = (0, _slicedToArray2["default"])(_names$map, 2),
247
- catalog = _names$map2[0],
248
- type = _names$map2[1];
249
-
215
+ });
216
+ var catalog = catalogAndType[0];
217
+ var type = catalogAndType[1];
250
218
  var mods = function mods(name, size) {
251
219
  if (size != null) {
252
220
  return name + '(' + size + ')';
253
221
  }
254
-
255
222
  return name;
256
- }; // handle the special "char" (in quotes) type
257
-
223
+ };
258
224
 
225
+ // handle the special "char" (in quotes) type
259
226
  if (catalog === 'char' && !type) {
260
227
  return mods('"char"', args);
261
228
  }
262
-
263
229
  if (catalog === 'pg_catalog' && type === 'char') {
264
230
  return mods('pg_catalog."char"', args);
265
231
  }
266
-
267
232
  if (catalog !== 'pg_catalog') {
268
233
  return mods(this.listQuotes(names, '.'), args);
269
234
  }
270
-
271
235
  var res = this.getPgCatalogTypeName(type, args);
272
236
  return mods(res, args);
273
237
  }
@@ -277,30 +241,23 @@ var Deparser = /*#__PURE__*/function () {
277
241
  if (item == null) {
278
242
  return null;
279
243
  }
280
-
281
- if (_lodash["default"].isNumber(item)) {
244
+ if (typeof item === 'number' || item instanceof Number) {
282
245
  return item;
283
246
  }
284
-
285
- var type = keys(item)[0];
286
-
287
- var node = _lodash["default"].values(item)[0];
288
-
247
+ var type = Object.keys(item)[0];
248
+ var node = item[type];
289
249
  if (this[type] == null) {
290
250
  throw new Error(type + ' is not implemented: ' + JSON.stringify(node));
291
251
  }
292
-
293
252
  return this[type](node, context);
294
253
  }
295
254
  }, {
296
255
  key: 'RawStmt',
297
256
  value: function RawStmt(node) {
298
257
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
299
-
300
258
  if (node.stmt_len) {
301
259
  return this.deparse(node.stmt, context) + ';';
302
260
  }
303
-
304
261
  return this.deparse(node.stmt, context);
305
262
  }
306
263
  }, {
@@ -310,59 +267,47 @@ var Deparser = /*#__PURE__*/function () {
310
267
  var output = [];
311
268
  output.push('CREATE');
312
269
  output.push('RULE');
313
-
314
270
  if (node.rulename === '_RETURN') {
315
271
  // special rules
316
272
  output.push('"_RETURN"');
317
273
  } else {
318
274
  output.push(node.rulename);
319
275
  }
320
-
321
276
  output.push('AS');
322
277
  output.push('ON');
323
-
324
278
  switch (node.event) {
325
279
  case 'CMD_SELECT':
326
280
  output.push('SELECT');
327
281
  break;
328
-
329
282
  case 'CMD_UPDATE':
330
283
  output.push('UPDATE');
331
284
  break;
332
-
333
285
  case 'CMD_INSERT':
334
286
  output.push('INSERT');
335
287
  break;
336
-
337
288
  case 'CMD_DELETE':
338
289
  output.push('DELETE');
339
290
  break;
340
-
341
291
  default:
342
292
  throw new Error('event type not yet implemented for RuleStmt');
343
293
  }
344
-
345
294
  output.push('TO');
346
295
  output.push(this.RangeVar(node.relation, context));
347
-
348
296
  if (node.whereClause) {
349
297
  output.push('WHERE');
350
298
  output.push(this.deparse(node.whereClause, context));
351
299
  }
352
-
353
300
  output.push('DO');
354
-
355
301
  if (node.instead) {
356
302
  output.push('INSTEAD');
357
303
  }
358
-
359
- if (!node.actions || !node.actions.length) {
304
+ var actions = unwrapList(node.actions);
305
+ if (!actions || !actions.length) {
360
306
  output.push('NOTHING');
361
307
  } else {
362
308
  // TODO how do multiple actions happen?
363
- output.push(this.deparse(node.actions[0], context));
309
+ output.push(this.deparse(actions[0], context));
364
310
  }
365
-
366
311
  return output.join(' ');
367
312
  }
368
313
  }, {
@@ -370,152 +315,126 @@ var Deparser = /*#__PURE__*/function () {
370
315
  value: function A_Expr(node) {
371
316
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
372
317
  var output = [];
373
-
318
+ var nodeName = unwrapList(node.name);
374
319
  switch (node.kind) {
375
320
  case 'AEXPR_OP':
376
321
  {
377
322
  var operator;
378
-
379
323
  if (node.lexpr) {
380
324
  // PARENS
381
- if (dotty.exists(node, 'lexpr.A_Expr')) {
325
+ if (node.lexpr !== undefined && node.lexpr.A_Expr !== undefined) {
382
326
  output.push(parens(this.deparse(node.lexpr, context)));
383
327
  } else {
384
328
  output.push(this.deparse(node.lexpr, context));
385
329
  }
386
330
  }
387
-
388
- if (node.name.length > 1) {
389
- var schema = this.deparse(node.name[0], context);
390
- operator = this.deparse(node.name[1], context);
331
+ if (nodeName.length > 1) {
332
+ var schema = this.deparse(nodeName[0], context);
333
+ operator = this.deparse(nodeName[1], context);
391
334
  output.push("OPERATOR(".concat(schema, ".").concat(operator, ")"));
392
335
  } else {
393
- operator = this.deparse(node.name[0], context);
336
+ operator = this.deparse(nodeName[0], context);
394
337
  output.push(operator);
395
338
  }
396
-
397
339
  if (node.rexpr) {
398
340
  // PARENS
399
- if (dotty.exists(node, 'rexpr.A_Expr')) {
341
+ if (node.rexpr !== undefined && node.rexpr.A_Expr !== undefined) {
400
342
  output.push(parens(this.deparse(node.rexpr, context)));
401
343
  } else {
402
344
  output.push(this.deparse(node.rexpr, context));
403
345
  }
404
346
  }
405
-
406
347
  if (output.length === 2) {
407
348
  return output.join('');
408
349
  }
409
-
410
350
  if (['->', '->>'].includes(operator)) {
411
351
  return output.join('');
412
352
  }
413
-
414
353
  return output.join(' ');
415
354
  }
416
-
417
355
  case 'AEXPR_OP_ANY':
418
356
  /* scalar op ANY (array) */
419
357
  output.push(this.deparse(node.lexpr, context));
420
358
  output.push((0, _util.format)('ANY (%s)', this.deparse(node.rexpr, context)));
421
- return output.join(" ".concat(this.deparse(node.name[0], context), " "));
422
-
359
+ return output.join(" ".concat(this.deparse(nodeName[0], context), " "));
423
360
  case 'AEXPR_OP_ALL':
424
361
  /* scalar op ALL (array) */
425
362
  output.push(this.deparse(node.lexpr, context));
426
363
  output.push((0, _util.format)('ALL (%s)', this.deparse(node.rexpr, context)));
427
- return output.join(" ".concat(this.deparse(node.name[0], context), " "));
428
-
364
+ return output.join(" ".concat(this.deparse(nodeName[0], context), " "));
429
365
  case 'AEXPR_DISTINCT':
430
366
  /* IS DISTINCT FROM - name must be "=" */
431
367
  return (0, _util.format)('%s IS DISTINCT FROM %s', this.deparse(node.lexpr, context), this.deparse(node.rexpr, context));
432
-
433
368
  case 'AEXPR_NOT_DISTINCT':
434
369
  /* IS NOT DISTINCT FROM - name must be "=" */
435
370
  return (0, _util.format)('%s IS NOT DISTINCT FROM %s', this.deparse(node.lexpr, context), this.deparse(node.rexpr, context));
436
-
437
371
  case 'AEXPR_NULLIF':
438
372
  /* NULLIF - name must be "=" */
439
373
  return (0, _util.format)('NULLIF(%s, %s)', this.deparse(node.lexpr, context), this.deparse(node.rexpr, context));
440
-
441
374
  case 'AEXPR_OF':
442
375
  {
443
376
  /* IS [NOT] OF - name must be "=" or "<>" */
444
- var op = node.name[0].String.str === '=' ? 'IS OF' : 'IS NOT OF';
377
+ var op = nodeName[0].String.str === '=' ? 'IS OF' : 'IS NOT OF';
445
378
  return (0, _util.format)('%s %s (%s)', this.deparse(node.lexpr, context), op, this.list(node.rexpr, ', ', '', context));
446
379
  }
447
-
448
380
  case 'AEXPR_IN':
449
381
  {
450
382
  /* [NOT] IN - name must be "=" or "<>" */
451
- var _operator = node.name[0].String.str === '=' ? 'IN' : 'NOT IN';
452
-
383
+ var _operator = nodeName[0].String.str === '=' ? 'IN' : 'NOT IN';
453
384
  return (0, _util.format)('%s %s (%s)', this.deparse(node.lexpr, context), _operator, this.list(node.rexpr, ', ', '', context));
454
385
  }
455
-
456
386
  case 'AEXPR_LIKE':
457
387
  /* [NOT] LIKE - name must be "~~" or "!~~" */
458
388
  output.push(this.deparse(node.lexpr, context));
459
-
460
- if (node.name[0].String.str === '!~~') {
389
+ if (nodeName[0].String.str === '!~~') {
461
390
  output.push((0, _util.format)('NOT LIKE (%s)', this.deparse(node.rexpr, context)));
462
391
  } else {
463
392
  output.push((0, _util.format)('LIKE (%s)', this.deparse(node.rexpr, context)));
464
393
  }
465
-
466
394
  return output.join(' ');
467
-
468
395
  case 'AEXPR_ILIKE':
469
396
  /* [NOT] ILIKE - name must be "~~*" or "!~~*" */
470
397
  output.push(this.deparse(node.lexpr, context));
471
-
472
- if (node.name[0].String.str === '!~~*') {
398
+ if (nodeName[0].String.str === '!~~*') {
473
399
  output.push((0, _util.format)('NOT ILIKE (%s)', this.deparse(node.rexpr, context)));
474
400
  } else {
475
401
  output.push((0, _util.format)('ILIKE (%s)', this.deparse(node.rexpr, context)));
476
402
  }
477
-
478
403
  return output.join(' ');
479
-
480
404
  case 'AEXPR_SIMILAR':
481
405
  // SIMILAR TO emits a similar_escape FuncCall node with the first argument
482
406
  output.push(this.deparse(node.lexpr, context));
483
-
484
- if (node.name[0].String.str === '~') {
485
- if (node.rexpr.FuncCall.args.length > 1) {
486
- output.push((0, _util.format)('SIMILAR TO %s ESCAPE %s', this.deparse(node.rexpr.FuncCall.args[0], context), this.deparse(node.rexpr.FuncCall.args[1], context)));
407
+ if (nodeName[0].String.str === '~') {
408
+ if (unwrapList(node.rexpr.FuncCall.args).length > 1) {
409
+ output.push((0, _util.format)('SIMILAR TO %s ESCAPE %s', this.deparse(unwrapList(node.rexpr.FuncCall.args)[0], context), this.deparse(unwrapList(node.rexpr.FuncCall.args)[1], context)));
487
410
  } else {
488
- output.push((0, _util.format)('SIMILAR TO %s', this.deparse(node.rexpr.FuncCall.args[0], context)));
411
+ output.push((0, _util.format)('SIMILAR TO %s', this.deparse(unwrapList(node.rexpr.FuncCall.args)[0], context)));
489
412
  }
490
413
  } else {
491
- if (node.rexpr.FuncCall.args.length > 1) {
492
- output.push((0, _util.format)('NOT SIMILAR TO %s ESCAPE %s', this.deparse(node.rexpr.FuncCall.args[0], context), this.deparse(node.rexpr.FuncCall.args[1], context)));
414
+ if (unwrapList(node.rexpr.FuncCall.args).length > 1) {
415
+ output.push((0, _util.format)('NOT SIMILAR TO %s ESCAPE %s', this.deparse(unwrapList(node.rexpr.FuncCall.args)[0], context), this.deparse(unwrapList(node.rexpr.FuncCall.args)[1], context)));
493
416
  } else {
494
- output.push((0, _util.format)('NOT SIMILAR TO %s', this.deparse(node.rexpr.FuncCall.args[0], context)));
417
+ output.push((0, _util.format)('NOT SIMILAR TO %s', this.deparse(unwrapList(node.rexpr.FuncCall.args)[0], context)));
495
418
  }
496
419
  }
497
-
498
420
  return output.join(' ');
499
-
500
421
  case 'AEXPR_BETWEEN':
501
422
  output.push(this.deparse(node.lexpr, context));
502
- output.push((0, _util.format)('BETWEEN %s AND %s', this.deparse(node.rexpr[0], context), this.deparse(node.rexpr[1], context)));
423
+ output.push((0, _util.format)('BETWEEN %s AND %s', this.deparse(unwrapList(node.rexpr)[0], context), this.deparse(unwrapList(node.rexpr)[1], context)));
503
424
  return output.join(' ');
504
-
505
425
  case 'AEXPR_NOT_BETWEEN':
506
426
  output.push(this.deparse(node.lexpr, context));
507
- output.push((0, _util.format)('NOT BETWEEN %s AND %s', this.deparse(node.rexpr[0], context), this.deparse(node.rexpr[1], context)));
427
+ output.push((0, _util.format)('NOT BETWEEN %s AND %s', this.deparse(unwrapList(node.rexpr)[0], context), this.deparse(unwrapList(node.rexpr)[1], context)));
508
428
  return output.join(' ');
509
-
510
429
  case 'AEXPR_BETWEEN_SYM':
511
430
  output.push(this.deparse(node.lexpr, context));
512
- output.push((0, _util.format)('BETWEEN SYMMETRIC %s AND %s', this.deparse(node.rexpr[0], context), this.deparse(node.rexpr[1], context)));
431
+ output.push((0, _util.format)('BETWEEN SYMMETRIC %s AND %s', this.deparse(unwrapList(node.rexpr)[0], context), this.deparse(unwrapList(node.rexpr)[1], context)));
513
432
  return output.join(' ');
514
-
515
433
  case 'AEXPR_NOT_BETWEEN_SYM':
516
434
  output.push(this.deparse(node.lexpr, context));
517
- output.push((0, _util.format)('NOT BETWEEN SYMMETRIC %s AND %s', this.deparse(node.rexpr[0], context), this.deparse(node.rexpr[1], context)));
435
+ output.push((0, _util.format)('NOT BETWEEN SYMMETRIC %s AND %s', this.deparse(unwrapList(node.rexpr)[0], context), this.deparse(unwrapList(node.rexpr)[1], context)));
518
436
  return output.join(' ');
437
+
519
438
  // case 15:
520
439
  // AEXPR_PAREN
521
440
 
@@ -529,13 +448,11 @@ var Deparser = /*#__PURE__*/function () {
529
448
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
530
449
  var name = node.aliasname;
531
450
  var output = ['AS'];
532
-
533
451
  if (node.colnames) {
534
452
  output.push(this.quote(name) + parens(this.listQuotes(node.colnames)));
535
453
  } else {
536
454
  output.push(this.quote(name));
537
455
  }
538
-
539
456
  return output.join(' ');
540
457
  }
541
458
  }, {
@@ -547,38 +464,36 @@ var Deparser = /*#__PURE__*/function () {
547
464
  key: 'A_Const',
548
465
  value: function A_Const(node) {
549
466
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
550
-
551
467
  if (node.val.String) {
552
468
  return this.escape(this.deparse(node.val, context));
553
469
  }
554
-
555
470
  return this.deparse(node.val, context);
556
471
  }
557
472
  }, {
558
473
  key: 'A_Indices',
559
474
  value: function A_Indices(node) {
560
475
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
561
-
562
476
  if (node.lidx) {
563
477
  return (0, _util.format)('[%s:%s]', this.deparse(node.lidx, context), this.deparse(node.uidx, context));
564
478
  }
565
-
566
479
  return (0, _util.format)('[%s]', this.deparse(node.uidx, context));
567
480
  }
568
481
  }, {
569
482
  key: 'A_Indirection',
570
483
  value: function A_Indirection(node) {
571
484
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
572
- var output = ["(".concat(this.deparse(node.arg, context), ")")]; // TODO(zhm) figure out the actual rules for when a '.' is needed
485
+ var output = ["(".concat(this.deparse(node.arg, context), ")")];
486
+
487
+ // TODO(zhm) figure out the actual rules for when a '.' is needed
573
488
  //
574
489
  // select a.b[0] from a;
575
490
  // select (select row(1)).*
576
491
  // select c2[2].f2 from comptable
577
492
  // select c2.a[2].f2[1].f3[0].a1 from comptable
578
493
 
579
- for (var i = 0; i < node.indirection.length; i++) {
580
- var subnode = node.indirection[i];
581
-
494
+ var indirection = unwrapList(node.indirection);
495
+ for (var i = 0; i < indirection.length; i++) {
496
+ var subnode = indirection[i];
582
497
  if (subnode.String || subnode.A_Star) {
583
498
  var value = subnode.A_Star ? '*' : this.quote(subnode.String.str);
584
499
  output.push(".".concat(value));
@@ -586,7 +501,6 @@ var Deparser = /*#__PURE__*/function () {
586
501
  output.push(this.deparse(subnode, context));
587
502
  }
588
503
  }
589
-
590
504
  return output.join('');
591
505
  }
592
506
  }, {
@@ -605,25 +519,18 @@ var Deparser = /*#__PURE__*/function () {
605
519
  value: function BoolExpr(node) {
606
520
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
607
521
  var fmt_str = '%s';
608
-
609
522
  if (context.bool) {
610
523
  fmt_str = '(%s)';
611
524
  }
612
-
613
- var ctx = _objectSpread({}, context);
614
-
525
+ var ctx = Object.assign({}, context);
615
526
  ctx.bool = true;
616
-
617
527
  switch (node.boolop) {
618
528
  case 'AND_EXPR':
619
529
  return (0, _util.format)(fmt_str, this.list(node.args, ' AND ', '', ctx));
620
-
621
530
  case 'OR_EXPR':
622
531
  return (0, _util.format)(fmt_str, this.list(node.args, ' OR ', '', ctx));
623
-
624
532
  case 'NOT_EXPR':
625
- return (0, _util.format)('NOT (%s)', this.deparse(node.args[0], context));
626
-
533
+ return (0, _util.format)('NOT (%s)', this.deparse(unwrapList(node.args)[0], context));
627
534
  default:
628
535
  return fail('BoolExpr', node);
629
536
  }
@@ -633,38 +540,29 @@ var Deparser = /*#__PURE__*/function () {
633
540
  value: function BooleanTest(node) {
634
541
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
635
542
  var output = [];
636
-
637
- var ctx = _objectSpread({}, context);
638
-
543
+ var ctx = Object.assign({}, context);
639
544
  ctx.bool = true;
640
545
  output.push(this.deparse(node.arg, ctx));
641
-
642
546
  switch (node.booltesttype) {
643
547
  case 'IS_TRUE':
644
548
  output.push('IS TRUE');
645
549
  break;
646
-
647
550
  case 'IS_NOT_TRUE':
648
551
  output.push('IS NOT TRUE');
649
552
  break;
650
-
651
553
  case 'IS_FALSE':
652
554
  output.push('IS FALSE');
653
555
  break;
654
-
655
556
  case 'IS_NOT_FALSE':
656
557
  output.push('IS NOT FALSE');
657
558
  break;
658
-
659
559
  case 'IS_UNKNOWN':
660
560
  output.push('IS UNKNOWN');
661
561
  break;
662
-
663
562
  case 'IS_NOT_UNKNOWN':
664
563
  output.push('IS NOT UNKNOWN');
665
564
  break;
666
565
  }
667
-
668
566
  return output.join(' ');
669
567
  }
670
568
  }, {
@@ -672,20 +570,17 @@ var Deparser = /*#__PURE__*/function () {
672
570
  value: function CaseExpr(node) {
673
571
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
674
572
  var output = ['CASE'];
675
-
676
573
  if (node.arg) {
677
574
  output.push(this.deparse(node.arg, context));
678
575
  }
679
-
680
- for (var i = 0; i < node.args.length; i++) {
681
- output.push(this.deparse(node.args[i], context));
576
+ var args = unwrapList(node.args);
577
+ for (var i = 0; i < args.length; i++) {
578
+ output.push(this.deparse(args[i], context));
682
579
  }
683
-
684
580
  if (node.defresult) {
685
581
  output.push('ELSE');
686
582
  output.push(this.deparse(node.defresult, context));
687
583
  }
688
-
689
584
  output.push('END');
690
585
  return output.join(' ');
691
586
  }
@@ -700,17 +595,13 @@ var Deparser = /*#__PURE__*/function () {
700
595
  value: function CollateClause(node) {
701
596
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
702
597
  var output = [];
703
-
704
598
  if (node.arg) {
705
599
  output.push(this.deparse(node.arg, context));
706
600
  }
707
-
708
601
  output.push('COLLATE');
709
-
710
602
  if (node.collname) {
711
603
  output.push(this.quote(this.deparseNodes(node.collname, context)));
712
604
  }
713
-
714
605
  return output.join(' ');
715
606
  }
716
607
  }, {
@@ -731,15 +622,12 @@ var Deparser = /*#__PURE__*/function () {
731
622
  value: function RenameStmt(node) {
732
623
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
733
624
  var output = [];
734
-
735
625
  if (node.renameType === 'OBJECT_FUNCTION' || node.renameType === 'OBJECT_FOREIGN_TABLE' || node.renameType === 'OBJECT_FDW' || node.renameType === 'OBJECT_FOREIGN_SERVER') {
736
626
  output.push('ALTER');
737
627
  output.push((0, _pgsqlEnums.objtypeName)(node.renameType));
738
-
739
628
  if (node.missing_ok) {
740
629
  output.push('IF EXISTS');
741
630
  }
742
-
743
631
  output.push(this.deparse(node.object, context));
744
632
  output.push('RENAME');
745
633
  output.push('TO');
@@ -747,11 +635,9 @@ var Deparser = /*#__PURE__*/function () {
747
635
  } else if (node.renameType === 'OBJECT_ATTRIBUTE') {
748
636
  output.push('ALTER');
749
637
  output.push((0, _pgsqlEnums.objtypeName)(node.relationType));
750
-
751
638
  if (node.missing_ok) {
752
639
  output.push('IF EXISTS');
753
640
  }
754
-
755
641
  output.push(this.RangeVar(node.relation, context));
756
642
  output.push('RENAME');
757
643
  output.push((0, _pgsqlEnums.objtypeName)(node.renameType));
@@ -761,11 +647,9 @@ var Deparser = /*#__PURE__*/function () {
761
647
  } else if (node.renameType === 'OBJECT_DOMAIN' || node.renameType === 'OBJECT_TYPE') {
762
648
  output.push('ALTER');
763
649
  output.push((0, _pgsqlEnums.objtypeName)(node.renameType));
764
-
765
650
  if (node.missing_ok) {
766
651
  output.push('IF EXISTS');
767
652
  }
768
-
769
653
  var typObj = {
770
654
  TypeName: {
771
655
  names: node.object
@@ -778,11 +662,9 @@ var Deparser = /*#__PURE__*/function () {
778
662
  } else if (node.renameType === 'OBJECT_SCHEMA') {
779
663
  output.push('ALTER');
780
664
  output.push((0, _pgsqlEnums.objtypeName)(node.renameType));
781
-
782
665
  if (node.missing_ok) {
783
666
  output.push('IF EXISTS');
784
667
  }
785
-
786
668
  output.push(this.quote(node.subname));
787
669
  output.push('RENAME');
788
670
  output.push('TO');
@@ -790,11 +672,9 @@ var Deparser = /*#__PURE__*/function () {
790
672
  } else if (node.renameType === 'OBJECT_DOMCONSTRAINT') {
791
673
  output.push('ALTER');
792
674
  output.push('DOMAIN');
793
-
794
675
  if (node.missing_ok) {
795
676
  output.push('IF EXISTS');
796
677
  }
797
-
798
678
  var _typObj = {
799
679
  TypeName: {
800
680
  names: node.object
@@ -808,22 +688,18 @@ var Deparser = /*#__PURE__*/function () {
808
688
  } else {
809
689
  output.push('ALTER');
810
690
  output.push('TABLE');
811
-
812
691
  if (node.missing_ok) {
813
692
  output.push('IF EXISTS');
814
693
  }
815
-
816
694
  output.push(this.RangeVar(node.relation, context));
817
695
  output.push('RENAME');
818
696
  output.push(this.quote(node.subname));
819
697
  output.push('TO');
820
698
  output.push(this.quote(node.newname));
821
699
  }
822
-
823
700
  if (node.behavior === 'DROP_CASCADE') {
824
701
  output.push('CASCADE');
825
702
  }
826
-
827
703
  return output.join(' ');
828
704
  }
829
705
  }, {
@@ -833,13 +709,12 @@ var Deparser = /*#__PURE__*/function () {
833
709
  var output = [];
834
710
  output.push('ALTER');
835
711
  output.push((0, _pgsqlEnums.objtypeName)(node.objectType));
836
-
837
- if (Array.isArray(node.object)) {
838
- output.push(this.listQuotes(node.object, '.'));
712
+ var unwrapped = unwrapList(node.object);
713
+ if (Array.isArray(unwrapped)) {
714
+ output.push(this.listQuotes(unwrapped, '.'));
839
715
  } else {
840
716
  output.push(this.deparse(node.object, context));
841
717
  }
842
-
843
718
  output.push('OWNER TO');
844
719
  output.push(this.RoleSpec(node.newowner, context));
845
720
  return output.join(' ');
@@ -849,36 +724,30 @@ var Deparser = /*#__PURE__*/function () {
849
724
  value: function AlterObjectSchemaStmt(node) {
850
725
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
851
726
  var output = [];
852
-
853
727
  if (node.objectType === 'OBJECT_TABLE') {
854
728
  output.push('ALTER');
855
729
  output.push((0, _pgsqlEnums.objtypeName)(node.objectType));
856
-
857
730
  if (node.missing_ok) {
858
731
  output.push('IF EXISTS');
859
732
  }
860
-
861
733
  output.push(this.RangeVar(node.relation, context));
862
734
  output.push('SET SCHEMA');
863
735
  output.push(this.quote(node.newschema));
864
736
  } else {
865
737
  output.push('ALTER');
866
738
  output.push((0, _pgsqlEnums.objtypeName)(node.objectType));
867
-
868
739
  if (node.missing_ok) {
869
740
  output.push('IF EXISTS');
870
741
  }
871
-
872
- if (Array.isArray(node.object)) {
873
- output.push(this.listQuotes(node.object, '.'));
742
+ var unwrapped = unwrapList(node.object);
743
+ if (Array.isArray(unwrapped)) {
744
+ output.push(this.listQuotes(unwrapped, '.'));
874
745
  } else {
875
746
  output.push(this.deparse(node.object, context));
876
747
  }
877
-
878
748
  output.push('SET SCHEMA');
879
749
  output.push(this.quote(node.newschema));
880
750
  }
881
-
882
751
  return output.join(' ');
883
752
  }
884
753
  }, {
@@ -887,23 +756,19 @@ var Deparser = /*#__PURE__*/function () {
887
756
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
888
757
  var output = [this.quote(node.colname)];
889
758
  output.push(this.TypeName(node.typeName, context));
890
-
891
759
  if (node.raw_default) {
892
760
  output.push('USING');
893
761
  output.push(this.deparse(node.raw_default, context));
894
762
  }
895
-
896
763
  if (node.constraints) {
897
764
  output.push(this.list(node.constraints, ' ', '', context));
898
765
  }
899
-
900
766
  if (node.collClause) {
901
767
  output.push('COLLATE');
902
- var str = dotty.get(node, 'collClause.collname.0.String.str');
768
+ var str = unwrapList(node.collClause.collname)[0].String.str;
903
769
  output.push(this.quote(str));
904
770
  }
905
-
906
- return _lodash["default"].compact(output).join(' ');
771
+ return compact(output).join(' ');
907
772
  }
908
773
  }, {
909
774
  key: 'SQLValueFunction',
@@ -911,39 +776,31 @@ var Deparser = /*#__PURE__*/function () {
911
776
  if (node.op === 'SVFOP_CURRENT_DATE') {
912
777
  return 'CURRENT_DATE';
913
778
  }
914
-
915
779
  if (node.op === 'SVFOP_CURRENT_TIMESTAMP') {
916
780
  return 'CURRENT_TIMESTAMP';
917
781
  }
918
-
919
782
  if (node.op === 'SVFOP_CURRENT_USER') {
920
783
  return 'CURRENT_USER';
921
784
  }
922
-
923
785
  if (node.op === 'SVFOP_SESSION_USER') {
924
786
  return 'SESSION_USER';
925
787
  }
926
-
927
788
  throw new Error("op=".concat(node.op, " SQLValueFunction not implemented"));
928
789
  }
929
790
  }, {
930
791
  key: 'ColumnRef',
931
792
  value: function ColumnRef(node) {
932
793
  var _this7 = this;
933
-
934
794
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
935
795
  var KEYWORDS = ['old', 'new'];
936
- var fields = node.fields.map(function (field) {
796
+ var fields = unwrapList(node.fields).map(function (field) {
937
797
  if (field.String) {
938
798
  var value = _this7.deparse(field, context);
939
-
940
799
  if (context === 'trigger' && KEYWORDS.includes(value.toLowerCase())) {
941
800
  return value.toUpperCase();
942
801
  }
943
-
944
802
  return _this7.quote(value);
945
803
  }
946
-
947
804
  return _this7.deparse(field, context);
948
805
  });
949
806
  return fields.join('.');
@@ -956,75 +813,71 @@ var Deparser = /*#__PURE__*/function () {
956
813
  output.push('COMMENT');
957
814
  output.push('ON');
958
815
  output.push((0, _pgsqlEnums.objtypeName)(node.objtype));
959
-
816
+ var object = unwrapList(node.object);
960
817
  if (node.objtype === 'OBJECT_CAST') {
961
818
  output.push('(');
962
- output.push(this.deparse(node.object[0], context));
819
+ output.push(this.deparse(object[0], context));
963
820
  output.push('AS');
964
- output.push(this.deparse(node.object[1], context));
821
+ output.push(this.deparse(object[1], context));
965
822
  output.push(')');
966
823
  } else if (node.objtype === 'OBJECT_DOMCONSTRAINT') {
967
- output.push(this.deparse(node.object[1], context));
824
+ output.push(this.deparse(object[1], context));
968
825
  output.push('ON');
969
826
  output.push('DOMAIN');
970
- output.push(this.deparse(node.object[0], context));
827
+ output.push(this.deparse(object[0], context));
971
828
  } else if (node.objtype === 'OBJECT_OPCLASS' || node.objtype === 'OBJECT_OPFAMILY') {
972
- output.push(this.deparse(node.object[1], context));
829
+ output.push(this.deparse(object[1], context));
973
830
  output.push('USING');
974
- output.push(this.deparse(node.object[0], context));
831
+ output.push(this.deparse(object[0], context));
975
832
  } else if (node.objtype === 'OBJECT_OPERATOR') {
976
- output.push(this.deparse(node.object, 'noquotes'));
833
+ output.push(this.deparse(object, 'noquotes'));
977
834
  } else if (node.objtype === 'OBJECT_POLICY') {
978
- output.push(this.deparse(node.object[1], context));
835
+ output.push(this.deparse(object[1], context));
979
836
  output.push('ON');
980
- output.push(this.deparse(node.object[0], context));
837
+ output.push(this.deparse(object[0], context));
981
838
  } else if (node.objtype === 'OBJECT_ROLE') {
982
- output.push(this.deparse(node.object, context));
839
+ output.push(this.deparse(object, context));
983
840
  } else if (node.objtype === 'OBJECT_RULE') {
984
- output.push(this.deparse(node.object[1], context));
841
+ output.push(this.deparse(object[1], context));
985
842
  output.push('ON');
986
- output.push(this.deparse(node.object[0], context));
843
+ output.push(this.deparse(object[0], context));
987
844
  } else if (node.objtype === 'OBJECT_TABCONSTRAINT') {
988
- if (node.object.length === 3) {
989
- output.push(this.deparse(node.object[2], context));
845
+ if (object.length === 3) {
846
+ output.push(this.deparse(object[2], context));
990
847
  output.push('ON');
991
- output.push(this.deparse(node.object[0], context) + '.' + this.deparse(node.object[1], context));
848
+ output.push(this.deparse(object[0], context) + '.' + this.deparse(object[1], context));
992
849
  } else {
993
- output.push(this.deparse(node.object[1], context));
850
+ output.push(this.deparse(object[1], context));
994
851
  output.push('ON');
995
- output.push(this.deparse(node.object[0], context));
852
+ output.push(this.deparse(object[0], context));
996
853
  }
997
854
  } else if (node.objtype === 'OBJECT_TRANSFORM') {
998
855
  output.push('FOR');
999
- output.push(this.deparse(node.object[0], context));
856
+ output.push(this.deparse(object[0], context));
1000
857
  output.push('LANGUAGE');
1001
- output.push(this.deparse(node.object[1], context));
858
+ output.push(this.deparse(object[1], context));
1002
859
  } else if (node.objtype === 'OBJECT_TRIGGER') {
1003
- output.push(this.deparse(node.object[1], context));
860
+ output.push(this.deparse(object[1], context));
1004
861
  output.push('ON');
1005
- output.push(this.deparse(node.object[0], context));
862
+ output.push(this.deparse(object[0], context));
1006
863
  } else {
1007
864
  if (node.objtype === 'OBJECT_LARGEOBJECT') {
1008
865
  output.push(dotty.get(node, 'object.Integer.ival'));
1009
- } else if (node.object instanceof Array) {
1010
- output.push(this.listQuotes(node.object, '.'));
866
+ } else if (object instanceof Array) {
867
+ output.push(this.listQuotes(object, '.'));
1011
868
  } else {
1012
- output.push(this.deparse(node.object, context));
869
+ output.push(this.deparse(object, context));
1013
870
  }
1014
-
1015
871
  if (node.objargs) {
1016
872
  output.push('(');
1017
873
  output.push(this.list(node.objargs, ', ', '', context));
1018
874
  output.push(')');
1019
875
  }
1020
876
  }
1021
-
1022
877
  output.push('IS');
1023
-
1024
878
  var escapeComment = function escapeComment(str) {
1025
879
  return str.replace(/\\/g, '\\');
1026
880
  };
1027
-
1028
881
  if (node.comment) {
1029
882
  if (/[^a-zA-Z0-9]/.test(node.comment)) {
1030
883
  // special chars we care about...
@@ -1036,7 +889,6 @@ var Deparser = /*#__PURE__*/function () {
1036
889
  } else {
1037
890
  output.push('NULL');
1038
891
  }
1039
-
1040
892
  return output.join(' ');
1041
893
  }
1042
894
  }, {
@@ -1045,20 +897,16 @@ var Deparser = /*#__PURE__*/function () {
1045
897
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1046
898
  var output = [];
1047
899
  output.push(node.ctename);
1048
-
1049
900
  if (node.aliascolnames) {
1050
901
  var colnames = this.quote(this.deparseNodes(node.aliascolnames, context));
1051
902
  output.push("(".concat(colnames.join(', '), ")"));
1052
903
  }
1053
-
1054
904
  output.push('AS');
1055
-
1056
905
  if (node.ctematerialized === 'CTEMaterializeAlways') {
1057
906
  output.push('MATERIALIZED');
1058
907
  } else if (node.ctematerialized === 'CTEMaterializeNever') {
1059
908
  output.push('NOT MATERIALIZED');
1060
909
  }
1061
-
1062
910
  output.push((0, _util.format)('(%s)', this.deparse(node.ctequery)));
1063
911
  return output.join(' ');
1064
912
  }
@@ -1068,63 +916,49 @@ var Deparser = /*#__PURE__*/function () {
1068
916
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1069
917
  var output = [];
1070
918
  output.push('CREATE');
1071
-
1072
919
  if (node.replace) {
1073
920
  output.push('OR REPLACE');
1074
921
  }
1075
-
1076
922
  switch (node.kind) {
1077
923
  case 'OBJECT_AGGREGATE':
1078
924
  output.push('AGGREGATE');
1079
925
  break;
1080
-
1081
926
  case 'OBJECT_OPERATOR':
1082
927
  output.push('OPERATOR');
1083
928
  break;
1084
-
1085
929
  case 'OBJECT_TYPE':
1086
930
  output.push('TYPE');
1087
931
  break;
1088
-
1089
932
  case 'OBJECT_TSPARSER':
1090
933
  output.push('TEXT SEARCH PARSER');
1091
934
  break;
1092
-
1093
935
  case 'OBJECT_TSDICTIONARY':
1094
936
  output.push('TEXT SEARCH DICTIONARY');
1095
937
  break;
1096
-
1097
938
  case 'OBJECT_TSTEMPLATE':
1098
939
  output.push('TEXT SEARCH TEMPLATE');
1099
940
  break;
1100
-
1101
941
  case 'OBJECT_TSCONFIGURATION':
1102
942
  output.push('TEXT SEARCH CONFIGURATION');
1103
943
  break;
1104
-
1105
944
  case 'OBJECT_COLLATION':
1106
945
  output.push('COLLATION');
1107
946
  break;
1108
-
1109
947
  default:
1110
948
  throw new Error('DefineStmt not recognized');
1111
949
  }
1112
-
1113
950
  if (node.if_not_exists) {
1114
951
  output.push('IF NOT EXISTS');
1115
952
  }
1116
-
1117
953
  switch (node.kind) {
1118
954
  case 'OBJECT_AGGREGATE':
1119
955
  // output.push(this.deparse(node.defnames));
1120
956
  output.push(this.list(node.defnames, '.', '', context));
1121
957
  break;
1122
-
1123
958
  case 'OBJECT_OPERATOR':
1124
- output.push(this.list(node.defnames, '.', '', context)); // output.push(this.deparse(node.defnames));
1125
-
959
+ output.push(this.list(node.defnames, '.', '', context));
960
+ // output.push(this.deparse(node.defnames));
1126
961
  break;
1127
-
1128
962
  case 'OBJECT_TYPE':
1129
963
  case 'OBJECT_TSPARSER':
1130
964
  case 'OBJECT_TSDICTIONARY':
@@ -1133,68 +967,53 @@ var Deparser = /*#__PURE__*/function () {
1133
967
  case 'OBJECT_COLLATION':
1134
968
  output.push(this.deparse(node.defnames));
1135
969
  break;
1136
-
1137
970
  default:
1138
971
  throw new Error('DefineStmt not recognized');
1139
972
  }
1140
-
1141
973
  if (!node.oldstyle && node.kind == 'OBJECT_AGGREGATE') {
1142
974
  output.push('(');
1143
975
  output.push("".concat(this.listQuotes(node.args[0], ',')));
1144
976
  output.push(')');
1145
977
  }
1146
-
1147
- if (node.definition.length > 0) {
978
+ var definition = unwrapList(node.definition);
979
+ if (definition.length > 0) {
1148
980
  output.push('(');
1149
-
1150
- for (var n = 0; n < node.definition.length; n++) {
1151
- var defElement = node.definition[n].DefElem;
981
+ for (var n = 0; n < definition.length; n++) {
982
+ var defElement = definition[n].DefElem;
1152
983
  output.push(defElement.defname);
1153
-
1154
984
  if (defElement.arg) {
1155
985
  output.push('=');
1156
986
  output.push(this.deparse(defElement.arg));
1157
987
  }
1158
-
1159
- if (n !== node.definition.length - 1) {
988
+ if (n !== definition.length - 1) {
1160
989
  output.push(',');
1161
990
  }
1162
991
  }
1163
-
1164
992
  output.push(')');
1165
993
  }
1166
-
1167
994
  return output.join(' ');
1168
995
  }
1169
996
  }, {
1170
997
  key: 'DefElem',
1171
998
  value: function DefElem(node) {
1172
999
  var _this8 = this;
1173
-
1174
1000
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1175
-
1176
1001
  if (node.defname === 'transaction_isolation') {
1177
1002
  return (0, _util.format)('ISOLATION LEVEL %s', node.arg.A_Const.val.String.str.toUpperCase());
1178
1003
  }
1179
-
1180
1004
  if (node.defname === 'transaction_read_only') {
1181
1005
  return node.arg.A_Const.val.Integer.ival === 0 ? 'READ WRITE' : 'READ ONLY';
1182
1006
  }
1183
-
1184
1007
  if (node.defname === 'transaction_deferrable') {
1185
1008
  return node.arg.A_Const.val.Integer.ival === 0 ? 'NOT DEFERRABLE' : 'DEFERRABLE';
1186
1009
  }
1187
-
1188
1010
  if (node.defname === 'set') {
1189
1011
  return this.deparse(node.arg, context);
1190
1012
  }
1191
-
1192
1013
  var name = node.defname;
1193
-
1194
1014
  if (node.defnamespace) {
1195
1015
  name = "".concat(node.defnamespace, ".").concat(node.defname);
1196
1016
  }
1197
-
1198
1017
  if (context === 'generated' || context === 'sequence') {
1199
1018
  switch (name) {
1200
1019
  case 'start':
@@ -1202,69 +1021,56 @@ var Deparser = /*#__PURE__*/function () {
1202
1021
  var start = this.deparse(node.arg, context);
1203
1022
  return "START WITH ".concat(start);
1204
1023
  }
1205
-
1206
1024
  case 'increment':
1207
1025
  {
1208
1026
  var inc = this.deparse(node.arg, context);
1209
-
1210
1027
  if (context === 'sequence') {
1211
1028
  // we need 'simple' so it doesn't wrap negative numbers in parens
1212
1029
  return "".concat(name, " ").concat(this.deparse(node.arg, 'simple'));
1213
1030
  }
1214
-
1215
1031
  return "INCREMENT BY ".concat(inc);
1216
1032
  }
1217
-
1218
1033
  case 'sequence_name':
1219
1034
  {
1220
1035
  return "SEQUENCE NAME ".concat(this.listQuotes(node.arg, '.'));
1221
1036
  }
1222
-
1223
1037
  case 'cycle':
1224
1038
  {
1225
1039
  var on = this.deparse(node.arg, context) + '' === '1';
1226
1040
  return on ? 'CYCLE' : 'NO CYCLE';
1227
1041
  }
1228
-
1229
1042
  case 'minvalue':
1230
1043
  {
1231
1044
  var off = !node.hasOwnProperty('arg');
1232
1045
  return off ? 'NO MINVALUE' : "".concat(name, " ").concat(this.deparse(node.arg, 'simple'));
1233
1046
  }
1234
-
1235
1047
  case 'maxvalue':
1236
1048
  {
1237
1049
  var _off = !node.hasOwnProperty('arg');
1238
-
1239
1050
  return _off ? 'NO MAXVALUE' : "".concat(name, " ").concat(this.deparse(node.arg, 'simple'));
1240
1051
  }
1241
1052
  // alter
1242
-
1243
1053
  case 'owned_by':
1244
1054
  {
1245
1055
  var output = [];
1246
- node.arg.forEach(function (opt) {
1056
+ unwrapList(node.arg).forEach(function (opt) {
1247
1057
  output.push(_this8.quote(_this8.deparse(opt, context)));
1248
1058
  });
1249
1059
  return "OWNED BY ".concat(output.join('.'));
1250
1060
  }
1251
1061
  // alter
1252
-
1253
1062
  case 'restart':
1254
1063
  {
1255
1064
  if (node.arg) {
1256
1065
  return "RESTART WITH ".concat(this.deparse(node.arg, context));
1257
1066
  }
1258
-
1259
1067
  return "RESTART";
1260
1068
  }
1261
-
1262
1069
  default:
1263
1070
  if (node.arg) {
1264
1071
  // we need 'simple' so it doesn't wrap negative numbers in parens
1265
1072
  return "".concat(name, " ").concat(this.deparse(node.arg, 'simple'));
1266
1073
  }
1267
-
1268
1074
  }
1269
1075
  } else if (context === 'explain') {
1270
1076
  if (node.arg) {
@@ -1273,7 +1079,6 @@ var Deparser = /*#__PURE__*/function () {
1273
1079
  } else if (node.arg) {
1274
1080
  return "".concat(name, " = ").concat(this.deparse(node.arg, context));
1275
1081
  }
1276
-
1277
1082
  return name;
1278
1083
  }
1279
1084
  }, {
@@ -1288,74 +1093,60 @@ var Deparser = /*#__PURE__*/function () {
1288
1093
  if (node.str[0] === '-') {
1289
1094
  return "(".concat(node.str, ")");
1290
1095
  }
1291
-
1292
1096
  return node.str;
1293
1097
  }
1294
1098
  }, {
1295
1099
  key: 'FuncCall',
1296
1100
  value: function FuncCall(node) {
1297
1101
  var _this9 = this;
1298
-
1299
1102
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1300
1103
  var output = [];
1301
1104
  var params = [];
1302
-
1303
1105
  if (node.args) {
1304
- params = node.args.map(function (item) {
1106
+ params = unwrapList(node.args).map(function (item) {
1305
1107
  return _this9.deparse(item, context);
1306
1108
  });
1307
- } // COUNT(*)
1308
-
1109
+ }
1309
1110
 
1111
+ // COUNT(*)
1310
1112
  if (node.agg_star) {
1311
1113
  params.push('*');
1312
1114
  }
1313
-
1314
1115
  var name = this.list(node.funcname, '.', '', context);
1315
1116
  var order = [];
1316
1117
  var withinGroup = node.agg_within_group;
1317
-
1318
1118
  if (node.agg_order) {
1319
1119
  order.push('ORDER BY');
1320
1120
  order.push(this.list(node.agg_order, ', ', '', context));
1321
1121
  }
1322
-
1323
1122
  var call = [];
1324
1123
  call.push(name + '(');
1325
-
1326
1124
  if (node.agg_distinct) {
1327
1125
  call.push('DISTINCT ');
1328
- } // prepend variadic before the last parameter
1329
- // SELECT CONCAT('|', VARIADIC ARRAY['1','2','3'])
1330
-
1126
+ }
1331
1127
 
1128
+ // prepend variadic before the last parameter
1129
+ // SELECT CONCAT('|', VARIADIC ARRAY['1','2','3'])
1332
1130
  if (node.func_variadic) {
1333
1131
  params[params.length - 1] = 'VARIADIC ' + params[params.length - 1];
1334
1132
  }
1335
-
1336
1133
  call.push(params.join(', '));
1337
-
1338
1134
  if (order.length && !withinGroup) {
1339
1135
  call.push(' ');
1340
1136
  call.push(order.join(' '));
1341
1137
  }
1342
-
1343
1138
  call.push(')');
1344
1139
  output.push(compact(call).join(''));
1345
-
1346
1140
  if (order.length && withinGroup) {
1347
1141
  output.push('WITHIN GROUP');
1348
1142
  output.push(parens(order.join(' ')));
1349
1143
  }
1350
-
1351
1144
  if (node.agg_filter != null) {
1352
1145
  output.push((0, _util.format)('FILTER (WHERE %s)', this.deparse(node.agg_filter, context)));
1353
1146
  }
1354
-
1355
1147
  if (node.over != null) {
1356
1148
  output.push((0, _util.format)('OVER %s', this.WindowDef(node.over, context)));
1357
1149
  }
1358
-
1359
1150
  return output.join(' ');
1360
1151
  }
1361
1152
  }, {
@@ -1368,23 +1159,17 @@ var Deparser = /*#__PURE__*/function () {
1368
1159
  key: 'GroupingSet',
1369
1160
  value: function GroupingSet(node) {
1370
1161
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1371
-
1372
1162
  switch (node.kind) {
1373
1163
  case 'GROUPING_SET_EMPTY':
1374
1164
  return '()';
1375
-
1376
1165
  case 'GROUPING_SET_SIMPLE':
1377
1166
  return fail('GroupingSet', node);
1378
-
1379
1167
  case 'GROUPING_SET_ROLLUP':
1380
1168
  return 'ROLLUP (' + this.list(node.content, ', ', '', context) + ')';
1381
-
1382
1169
  case 'GROUPING_SET_CUBE':
1383
1170
  return 'CUBE (' + this.list(node.content, ', ', '', context) + ')';
1384
-
1385
1171
  case 'GROUPING_SET_SETS':
1386
1172
  return 'GROUPING SETS (' + this.list(node.content, ', ', '', context) + ')';
1387
-
1388
1173
  default:
1389
1174
  return fail('GroupingSet', node);
1390
1175
  }
@@ -1395,50 +1180,39 @@ var Deparser = /*#__PURE__*/function () {
1395
1180
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1396
1181
  var output = [];
1397
1182
  output.push('CREATE');
1398
-
1399
1183
  if (node.unique) {
1400
1184
  output.push('UNIQUE');
1401
1185
  }
1402
-
1403
1186
  output.push('INDEX');
1404
-
1405
1187
  if (node.concurrent) {
1406
1188
  output.push('CONCURRENTLY');
1407
1189
  }
1408
-
1409
1190
  if (node.idxname) {
1410
1191
  output.push(node.idxname);
1411
1192
  }
1412
-
1413
1193
  output.push('ON');
1414
1194
  output.push(this.RangeVar(node.relation, context));
1415
-
1416
1195
  if (node.accessMethod) {
1417
1196
  var accessMethod = node.accessMethod.toUpperCase();
1418
-
1419
1197
  if (accessMethod !== 'BTREE') {
1420
1198
  output.push('USING');
1421
1199
  output.push(accessMethod);
1422
1200
  }
1423
1201
  }
1424
-
1425
1202
  if (node.indexParams) {
1426
1203
  output.push('(');
1427
1204
  output.push(this.list(node.indexParams, ', ', '', context));
1428
1205
  output.push(')');
1429
1206
  }
1430
-
1431
1207
  if (node.indexIncludingParams) {
1432
1208
  output.push('INCLUDE (');
1433
1209
  output.push(this.list(node.indexIncludingParams, ', ', '', context));
1434
1210
  output.push(')');
1435
1211
  }
1436
-
1437
1212
  if (node.whereClause) {
1438
1213
  output.push('WHERE');
1439
1214
  output.push(this.deparse(node.whereClause, context));
1440
1215
  }
1441
-
1442
1216
  return output.join(' ');
1443
1217
  }
1444
1218
  }, {
@@ -1446,23 +1220,18 @@ var Deparser = /*#__PURE__*/function () {
1446
1220
  value: function IndexElem(node) {
1447
1221
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1448
1222
  var output = [];
1449
-
1450
1223
  if (node.name) {
1451
1224
  output.push(node.name);
1452
-
1453
1225
  if (node.ordering === 'SORTBY_DESC') {
1454
1226
  output.push('DESC');
1455
1227
  } else if (node.ordering === 'SORTBY_ASC') {
1456
1228
  output.push('ASC');
1457
1229
  }
1458
-
1459
1230
  return output.join(' ');
1460
1231
  }
1461
-
1462
1232
  if (node.expr) {
1463
1233
  return this.deparse(node.expr, context);
1464
1234
  }
1465
-
1466
1235
  return fail('IndexElem', node);
1467
1236
  }
1468
1237
  }, {
@@ -1470,30 +1239,25 @@ var Deparser = /*#__PURE__*/function () {
1470
1239
  value: function InsertStmt(node) {
1471
1240
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1472
1241
  var output = [];
1473
-
1474
1242
  if (node.withClause) {
1475
1243
  output.push(this.WithClause(node.withClause, context));
1476
1244
  }
1477
-
1478
1245
  output.push('INSERT INTO');
1479
1246
  output.push(this.RangeVar(node.relation, context));
1480
-
1481
- if (node.cols && node.cols.length) {
1247
+ var cols = unwrapList(node.cols);
1248
+ if (cols && cols.length) {
1482
1249
  output.push('(');
1483
- output.push(this.list(node.cols, ', ', '', context));
1250
+ output.push(this.list(cols, ', ', '', context));
1484
1251
  output.push(')');
1485
1252
  }
1486
-
1487
1253
  if (node.selectStmt) {
1488
1254
  output.push(this.deparse(node.selectStmt, context));
1489
1255
  } else {
1490
1256
  output.push('DEFAULT VALUES');
1491
1257
  }
1492
-
1493
1258
  if (node.onConflictClause) {
1494
1259
  var clause = node.onConflictClause;
1495
1260
  output.push('ON CONFLICT');
1496
-
1497
1261
  if (clause.infer.indexElems) {
1498
1262
  output.push('(');
1499
1263
  output.push(this.list(clause.infer.indexElems, ', ', '', context));
@@ -1502,27 +1266,22 @@ var Deparser = /*#__PURE__*/function () {
1502
1266
  output.push('ON CONSTRAINT');
1503
1267
  output.push(clause.infer.conname);
1504
1268
  }
1505
-
1506
1269
  switch (clause.action) {
1507
1270
  case 'ONCONFLICT_NOTHING':
1508
1271
  output.push('DO NOTHING');
1509
1272
  break;
1510
-
1511
1273
  case 'ONCONFLICT_UPDATE':
1512
1274
  output.push('DO');
1513
1275
  output.push(this.UpdateStmt(clause, context));
1514
1276
  break;
1515
-
1516
1277
  default:
1517
1278
  throw new Error('unhandled CONFLICT CLAUSE');
1518
1279
  }
1519
1280
  }
1520
-
1521
1281
  if (node.returningList) {
1522
1282
  output.push('RETURNING');
1523
1283
  output.push(this.deparseReturningList(node.returningList, context));
1524
1284
  }
1525
-
1526
1285
  return output.join(' ');
1527
1286
  }
1528
1287
  }, {
@@ -1543,95 +1302,78 @@ var Deparser = /*#__PURE__*/function () {
1543
1302
  value: function DeleteStmt(node) {
1544
1303
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1545
1304
  var output = [''];
1546
-
1547
1305
  if (node.withClause) {
1548
1306
  output.push(this.WithClause(node.withClause, context));
1549
1307
  }
1550
-
1551
1308
  output.push('DELETE');
1552
1309
  output.push('FROM');
1553
1310
  output.push(this.RangeVar(node.relation, context));
1554
-
1555
1311
  if (node.usingClause) {
1556
1312
  output.push('USING');
1557
1313
  output.push(this.list(node.usingClause, ', ', '', context));
1558
1314
  }
1559
-
1560
1315
  if (node.whereClause) {
1561
1316
  output.push('WHERE');
1562
1317
  output.push(this.deparse(node.whereClause, context));
1563
1318
  }
1564
-
1565
1319
  if (node.returningList) {
1566
1320
  output.push('RETURNING');
1567
1321
  output.push(this.deparseReturningList(node.returningList, context));
1568
1322
  }
1569
-
1570
1323
  return output.join(' ');
1571
1324
  }
1572
1325
  }, {
1573
1326
  key: 'UpdateStmt',
1574
1327
  value: function UpdateStmt(node) {
1575
1328
  var _this10 = this;
1576
-
1577
1329
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1578
1330
  var output = [];
1579
-
1580
1331
  if (node.withClause) {
1581
1332
  output.push(this.WithClause(node.withClause, context));
1582
1333
  }
1583
-
1584
1334
  output.push('UPDATE');
1585
-
1586
1335
  if (node.relation) {
1587
1336
  // onConflictClause no relation..
1588
1337
  output.push(this.RangeVar(node.relation, context));
1589
1338
  }
1590
-
1591
1339
  output.push('SET');
1592
-
1593
- if (node.targetList && node.targetList.length) {
1594
- if (node.targetList[0].ResTarget && node.targetList[0].ResTarget.val && node.targetList[0].ResTarget.val.MultiAssignRef) {
1340
+ var targetList = unwrapList(node.targetList);
1341
+ if (targetList && targetList.length) {
1342
+ if (targetList[0].ResTarget && targetList[0].ResTarget.val && targetList[0].ResTarget.val.MultiAssignRef) {
1595
1343
  output.push('(');
1596
- output.push(node.targetList.map(function (target) {
1344
+ output.push(targetList.map(function (target) {
1597
1345
  return target.ResTarget.name;
1598
1346
  }).join(','));
1599
1347
  output.push(')');
1600
1348
  output.push('=');
1601
- output.push(this.deparse(node.targetList[0].ResTarget.val, context));
1349
+ output.push(this.deparse(targetList[0].ResTarget.val, context));
1602
1350
  } else {
1603
- output.push(node.targetList.map(function (target) {
1351
+ output.push(targetList.map(function (target) {
1604
1352
  return _this10.deparse(target, 'update');
1605
1353
  }).join(','));
1606
1354
  }
1607
1355
  }
1608
-
1609
1356
  if (node.fromClause) {
1610
1357
  output.push('FROM');
1611
1358
  output.push(this.list(node.fromClause, ', ', '', context));
1612
1359
  }
1613
-
1614
1360
  if (node.whereClause) {
1615
1361
  output.push('WHERE');
1616
1362
  output.push(this.deparse(node.whereClause, context));
1617
1363
  }
1618
-
1619
1364
  if (node.returningList) {
1620
1365
  output.push('RETURNING');
1621
1366
  output.push(this.deparseReturningList(node.returningList, context));
1622
1367
  }
1623
-
1624
1368
  return output.join(' ');
1625
1369
  }
1626
1370
  }, {
1627
1371
  key: 'Integer',
1628
1372
  value: function Integer(node) {
1629
1373
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1630
-
1631
1374
  if (node.ival < 0 && context !== 'simple') {
1632
1375
  return "(".concat(node.ival, ")");
1633
1376
  }
1634
-
1635
1377
  return node.ival.toString();
1636
1378
  }
1637
1379
  }, {
@@ -1646,45 +1388,34 @@ var Deparser = /*#__PURE__*/function () {
1646
1388
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1647
1389
  var output = [];
1648
1390
  output.push(this.deparse(node.larg, context));
1649
-
1650
1391
  if (node.isNatural) {
1651
1392
  output.push('NATURAL');
1652
1393
  }
1653
-
1654
1394
  var join = null;
1655
-
1656
1395
  switch (true) {
1657
1396
  case node.jointype === 'JOIN_INNER' && node.quals != null:
1658
1397
  join = 'INNER JOIN';
1659
1398
  break;
1660
-
1661
1399
  case node.jointype === 'JOIN_INNER' && !node.isNatural && !(node.quals != null) && !(node.usingClause != null):
1662
1400
  join = 'CROSS JOIN';
1663
1401
  break;
1664
-
1665
1402
  case node.jointype === 'JOIN_INNER':
1666
1403
  join = 'JOIN';
1667
1404
  break;
1668
-
1669
1405
  case node.jointype === 'JOIN_LEFT':
1670
1406
  join = 'LEFT OUTER JOIN';
1671
1407
  break;
1672
-
1673
1408
  case node.jointype === 'JOIN_FULL':
1674
1409
  join = 'FULL OUTER JOIN';
1675
1410
  break;
1676
-
1677
1411
  case node.jointype === 'JOIN_RIGHT':
1678
1412
  join = 'RIGHT OUTER JOIN';
1679
1413
  break;
1680
-
1681
1414
  default:
1682
1415
  fail('JoinExpr', node);
1683
1416
  break;
1684
1417
  }
1685
-
1686
1418
  output.push(join);
1687
-
1688
1419
  if (node.rarg) {
1689
1420
  // wrap nested join expressions in parens to make the following symmetric:
1690
1421
  // select * from int8_tbl x cross join (int4_tbl x cross join lateral (select x.f1) ss)
@@ -1694,22 +1425,17 @@ var Deparser = /*#__PURE__*/function () {
1694
1425
  output.push(this.deparse(node.rarg, context));
1695
1426
  }
1696
1427
  }
1697
-
1698
1428
  if (node.quals) {
1699
1429
  output.push("ON ".concat(this.deparse(node.quals, context)));
1700
1430
  }
1701
-
1702
1431
  if (node.usingClause) {
1703
1432
  var using = this.quote(this.deparseNodes(node.usingClause, context)).join(', ');
1704
1433
  output.push("USING (".concat(using, ")"));
1705
1434
  }
1706
-
1707
1435
  var wrapped = node.rarg.JoinExpr != null || node.alias ? '(' + output.join(' ') + ')' : output.join(' ');
1708
-
1709
1436
  if (node.alias) {
1710
1437
  return wrapped + ' ' + this.Alias(node.alias, context);
1711
1438
  }
1712
-
1713
1439
  return wrapped;
1714
1440
  }
1715
1441
  }, {
@@ -1717,37 +1443,29 @@ var Deparser = /*#__PURE__*/function () {
1717
1443
  value: function LockingClause(node) {
1718
1444
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1719
1445
  var output = [];
1720
-
1721
1446
  switch (node.strength) {
1722
1447
  case 'LCS_NONE':
1723
1448
  output.push('NONE');
1724
1449
  break;
1725
-
1726
1450
  case 'LCS_FORKEYSHARE':
1727
1451
  output.push('FOR KEY SHARE');
1728
1452
  break;
1729
-
1730
1453
  case 'LCS_FORSHARE':
1731
1454
  output.push('FOR SHARE');
1732
1455
  break;
1733
-
1734
1456
  case 'LCS_FORNOKEYUPDATE':
1735
1457
  output.push('FOR NO KEY UPDATE');
1736
1458
  break;
1737
-
1738
1459
  case 'LCS_FORUPDATE':
1739
1460
  output.push('FOR UPDATE');
1740
1461
  break;
1741
-
1742
1462
  default:
1743
1463
  return fail('LockingClause', node);
1744
1464
  }
1745
-
1746
1465
  if (node.lockedRels) {
1747
1466
  output.push('OF');
1748
1467
  output.push(this.list(node.lockedRels, ', ', '', context));
1749
1468
  }
1750
-
1751
1469
  return output.join(' ');
1752
1470
  }
1753
1471
  }, {
@@ -1761,11 +1479,9 @@ var Deparser = /*#__PURE__*/function () {
1761
1479
  output.push('IN');
1762
1480
  output.push(LOCK_MODES[node.mode]);
1763
1481
  output.push('MODE');
1764
-
1765
1482
  if (node.nowait) {
1766
1483
  output.push('NOWAIT');
1767
1484
  }
1768
-
1769
1485
  return output.join(' ');
1770
1486
  }
1771
1487
  }, {
@@ -1773,13 +1489,11 @@ var Deparser = /*#__PURE__*/function () {
1773
1489
  value: function MinMaxExpr(node) {
1774
1490
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1775
1491
  var output = [];
1776
-
1777
1492
  if (node.op === 'IS_GREATEST') {
1778
1493
  output.push('GREATEST');
1779
1494
  } else {
1780
1495
  output.push('LEAST');
1781
1496
  }
1782
-
1783
1497
  output.push(parens(this.list(node.args, ', ', '', context)));
1784
1498
  return output.join('');
1785
1499
  }
@@ -1803,13 +1517,11 @@ var Deparser = /*#__PURE__*/function () {
1803
1517
  value: function NullTest(node) {
1804
1518
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1805
1519
  var output = [this.deparse(node.arg, context)];
1806
-
1807
1520
  if (node.nulltesttype === 'IS_NULL') {
1808
1521
  output.push('IS NULL');
1809
1522
  } else if (node.nulltesttype === 'IS_NOT_NULL') {
1810
1523
  output.push('IS NOT NULL');
1811
1524
  }
1812
-
1813
1525
  return output.join(' ');
1814
1526
  }
1815
1527
  }, {
@@ -1818,7 +1530,6 @@ var Deparser = /*#__PURE__*/function () {
1818
1530
  if (node.number >= 0) {
1819
1531
  return ['$', node.number].join('');
1820
1532
  }
1821
-
1822
1533
  return '?';
1823
1534
  }
1824
1535
  }, {
@@ -1826,50 +1537,40 @@ var Deparser = /*#__PURE__*/function () {
1826
1537
  value: function RangeFunction(node) {
1827
1538
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1828
1539
  var output = [];
1829
-
1830
1540
  if (node.lateral) {
1831
1541
  output.push('LATERAL');
1832
1542
  }
1833
-
1834
1543
  var funcs = [];
1835
-
1836
- for (var i = 0; i < node.functions.length; i++) {
1837
- var funcCall = node.functions[i];
1544
+ var functions = unwrapList(node.functions);
1545
+ for (var i = 0; i < functions.length; i++) {
1546
+ var funcCall = unwrapList(functions[i]);
1838
1547
  var call = [this.deparse(funcCall[0], context)];
1839
-
1840
- if (funcCall[1] && funcCall[1].length) {
1841
- call.push((0, _util.format)('AS (%s)', this.list(funcCall[1], ', ', '', context)));
1548
+ var secondFuncCall = unwrapList(funcCall[1]);
1549
+ if (secondFuncCall && secondFuncCall.length) {
1550
+ call.push((0, _util.format)('AS (%s)', this.list(secondFuncCall, ', ', '', context)));
1842
1551
  }
1843
-
1844
1552
  funcs.push(call.join(' '));
1845
1553
  }
1846
-
1847
1554
  var calls = funcs.join(', ');
1848
-
1849
1555
  if (node.is_rowsfrom) {
1850
1556
  output.push("ROWS FROM (".concat(calls, ")"));
1851
1557
  } else {
1852
1558
  output.push(calls);
1853
1559
  }
1854
-
1855
1560
  if (node.ordinality) {
1856
1561
  output.push('WITH ORDINALITY');
1857
1562
  }
1858
-
1859
1563
  if (node.alias) {
1860
1564
  output.push(this.Alias(node.alias, context));
1861
1565
  }
1862
-
1863
1566
  if (node.coldeflist) {
1864
1567
  var defList = this.list(node.coldeflist, ', ', '', context);
1865
-
1866
1568
  if (!node.alias) {
1867
1569
  output.push(" AS (".concat(defList, ")"));
1868
1570
  } else {
1869
1571
  output.push("(".concat(defList, ")"));
1870
1572
  }
1871
1573
  }
1872
-
1873
1574
  return output.join(' ');
1874
1575
  }
1875
1576
  }, {
@@ -1877,17 +1578,13 @@ var Deparser = /*#__PURE__*/function () {
1877
1578
  value: function RangeSubselect(node) {
1878
1579
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1879
1580
  var output = '';
1880
-
1881
1581
  if (node.lateral) {
1882
1582
  output += 'LATERAL ';
1883
1583
  }
1884
-
1885
1584
  output += parens(this.deparse(node.subquery, context));
1886
-
1887
1585
  if (node.alias) {
1888
1586
  return output + ' ' + this.Alias(node.alias, context);
1889
1587
  }
1890
-
1891
1588
  return output;
1892
1589
  }
1893
1590
  }, {
@@ -1897,16 +1594,13 @@ var Deparser = /*#__PURE__*/function () {
1897
1594
  var output = [];
1898
1595
  output.push(this.deparse(node.relation, context));
1899
1596
  output.push('TABLESAMPLE');
1900
- output.push(this.deparse(node.method[0], context));
1901
-
1597
+ output.push(this.deparse(unwrapList(node.method)[0], context));
1902
1598
  if (node.args) {
1903
1599
  output.push(parens(this.list(node.args, ', ', '', context)));
1904
1600
  }
1905
-
1906
1601
  if (node.repeatable) {
1907
1602
  output.push('REPEATABLE(' + this.deparse(node.repeatable, context) + ')');
1908
1603
  }
1909
-
1910
1604
  return output.join(' ');
1911
1605
  }
1912
1606
  }, {
@@ -1914,40 +1608,32 @@ var Deparser = /*#__PURE__*/function () {
1914
1608
  value: function RangeVar(node) {
1915
1609
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1916
1610
  var output = [];
1917
-
1918
1611
  if (node.inhOpt === 0) {
1919
1612
  output.push('ONLY');
1920
1613
  }
1921
-
1922
1614
  if (!node.inh && (context.lock || context === 'truncate')) {
1923
1615
  output.push('ONLY');
1924
1616
  }
1925
-
1926
1617
  if (node.relpersistence === 'u') {
1927
1618
  output.push('UNLOGGED');
1928
1619
  }
1929
-
1930
1620
  if (node.relpersistence === 't' && context !== 'view') {
1931
1621
  output.push('TEMPORARY TABLE');
1932
1622
  }
1933
-
1934
1623
  if (node.schemaname != null) {
1935
1624
  output.push("".concat(this.quote(node.schemaname), ".").concat(this.quote(node.relname)));
1936
1625
  } else {
1937
1626
  output.push(this.quote(node.relname));
1938
1627
  }
1939
-
1940
1628
  if (node.alias) {
1941
1629
  output.push(this.Alias(node.alias, context));
1942
1630
  }
1943
-
1944
1631
  return output.join(' ');
1945
1632
  }
1946
1633
  }, {
1947
1634
  key: 'ResTarget',
1948
1635
  value: function ResTarget(node) {
1949
1636
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1950
-
1951
1637
  if (context === 'select') {
1952
1638
  return compact([this.deparse(node.val, context), this.quote(node.name)]).join(' AS ');
1953
1639
  } else if (context === 'update') {
@@ -1955,18 +1641,15 @@ var Deparser = /*#__PURE__*/function () {
1955
1641
  } else if (!(node.val != null)) {
1956
1642
  return this.quote(node.name);
1957
1643
  }
1958
-
1959
1644
  return fail('ResTarget', node);
1960
1645
  }
1961
1646
  }, {
1962
1647
  key: 'RowExpr',
1963
1648
  value: function RowExpr(node) {
1964
1649
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1965
-
1966
1650
  if (node.row_format === 'COERCE_IMPLICIT_CAST') {
1967
1651
  return parens(this.list(node.args, ', ', '', context));
1968
1652
  }
1969
-
1970
1653
  return (0, _util.format)('ROW(%s)', this.list(node.args, ', ', '', context));
1971
1654
  }
1972
1655
  }, {
@@ -1975,13 +1658,11 @@ var Deparser = /*#__PURE__*/function () {
1975
1658
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1976
1659
  var output = [];
1977
1660
  output.push('EXPLAIN');
1978
-
1979
1661
  if (node.options) {
1980
1662
  output.push('(');
1981
1663
  output.push(this.list(node.options, ', ', '', 'explain'));
1982
1664
  output.push(')');
1983
1665
  }
1984
-
1985
1666
  output.push(this.deparse(node.query, context));
1986
1667
  return output.join(' ');
1987
1668
  }
@@ -1989,14 +1670,11 @@ var Deparser = /*#__PURE__*/function () {
1989
1670
  key: 'SelectStmt',
1990
1671
  value: function SelectStmt(node) {
1991
1672
  var _this11 = this;
1992
-
1993
1673
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1994
1674
  var output = [];
1995
-
1996
1675
  if (node.withClause) {
1997
1676
  output.push(this.WithClause(node.withClause, context));
1998
1677
  }
1999
-
2000
1678
  if (node.op === 'SETOP_NONE') {
2001
1679
  // VALUES select's don't get SELECT
2002
1680
  if (node.valuesLists == null) {
@@ -2004,133 +1682,111 @@ var Deparser = /*#__PURE__*/function () {
2004
1682
  }
2005
1683
  } else {
2006
1684
  output.push(parens(this.SelectStmt(node.larg, context)));
2007
-
2008
1685
  switch (node.op) {
2009
1686
  case 'SETOP_NONE':
2010
1687
  output.push('NONE');
2011
1688
  break;
2012
-
2013
1689
  case 'SETOP_UNION':
2014
1690
  output.push('UNION');
2015
1691
  break;
2016
-
2017
1692
  case 'SETOP_INTERSECT':
2018
1693
  output.push('INTERSECT');
2019
1694
  break;
2020
-
2021
1695
  case 'SETOP_EXCEPT':
2022
1696
  output.push('EXCEPT');
2023
1697
  break;
2024
-
2025
1698
  default:
2026
1699
  throw new Error('bad SelectStmt op');
2027
1700
  }
2028
-
2029
1701
  if (node.all) {
2030
1702
  output.push('ALL');
2031
1703
  }
2032
-
2033
1704
  output.push(parens(this.SelectStmt(node.rarg, context)));
2034
1705
  }
2035
-
2036
1706
  if (node.distinctClause) {
2037
- if (!isEmptyObject(node.distinctClause[0]) // new change distinctClause can be {}
1707
+ var distinctClause = unwrapList(node.distinctClause);
1708
+ if (!isEmptyObject(distinctClause[0])
1709
+ // new change distinctClause can be {}
2038
1710
  ) {
2039
- output.push('DISTINCT ON');
2040
- var clause = node.distinctClause.map(function (e) {
2041
- return _this11.deparse(e, 'select');
2042
- }).join(",".concat(NEWLINE_CHAR));
2043
- output.push("(".concat(clause, ")"));
2044
- } else {
1711
+ output.push('DISTINCT ON');
1712
+ var clause = distinctClause.map(function (e) {
1713
+ return _this11.deparse(e, 'select');
1714
+ }).join(",".concat(NEWLINE_CHAR));
1715
+ output.push("(".concat(clause, ")"));
1716
+ } else {
2045
1717
  output.push('DISTINCT');
2046
1718
  }
2047
1719
  }
2048
-
2049
1720
  if (node.targetList) {
2050
- output.push(indent(node.targetList.map(function (e) {
1721
+ output.push(indent(unwrapList(node.targetList).map(function (e) {
2051
1722
  return _this11.deparse(e, 'select');
2052
1723
  }).join(",".concat(NEWLINE_CHAR))));
2053
1724
  }
2054
-
2055
1725
  if (node.intoClause) {
2056
1726
  output.push('INTO');
2057
1727
  output.push(indent(this.IntoClause(node.intoClause, context)));
2058
1728
  }
2059
-
2060
1729
  if (node.fromClause) {
2061
1730
  output.push('FROM');
2062
- output.push(indent(node.fromClause.map(function (e) {
1731
+ output.push(indent(unwrapList(node.fromClause).map(function (e) {
2063
1732
  return _this11.deparse(e, 'from');
2064
1733
  }).join(",".concat(NEWLINE_CHAR))));
2065
1734
  }
2066
-
2067
1735
  if (node.whereClause) {
2068
1736
  output.push('WHERE');
2069
1737
  output.push(indent(this.deparse(node.whereClause, context)));
2070
1738
  }
2071
-
2072
1739
  if (node.valuesLists) {
2073
1740
  output.push('VALUES');
2074
- var lists = node.valuesLists.map(function (list) {
1741
+ var lists = unwrapList(node.valuesLists).map(function (list) {
2075
1742
  return "(".concat(_this11.list(list, ', ', '', context), ")");
2076
1743
  });
2077
1744
  output.push(lists.join(', '));
2078
1745
  }
2079
-
2080
1746
  if (node.groupClause) {
2081
1747
  output.push('GROUP BY');
2082
- output.push(indent(node.groupClause.map(function (e) {
1748
+ output.push(indent(unwrapList(node.groupClause).map(function (e) {
2083
1749
  return _this11.deparse(e, 'group');
2084
1750
  }).join(",".concat(NEWLINE_CHAR))));
2085
1751
  }
2086
-
2087
1752
  if (node.havingClause) {
2088
1753
  output.push('HAVING');
2089
1754
  output.push(indent(this.deparse(node.havingClause, context)));
2090
1755
  }
2091
-
2092
1756
  if (node.windowClause) {
2093
1757
  output.push('WINDOW');
2094
1758
  var windows = [];
2095
-
2096
- for (var i = 0; i < node.windowClause.length; i++) {
2097
- var w = node.windowClause[i];
1759
+ var windowClause = unwrapList(node.windowClause);
1760
+ for (var i = 0; i < windowClause.length; i++) {
1761
+ var w = windowClause[i];
2098
1762
  var window = [];
2099
-
2100
1763
  if (w.WindowDef.name) {
2101
1764
  window.push(this.quote(w.WindowDef.name) + ' AS');
2102
1765
  }
2103
-
2104
1766
  window.push(parens(this.deparse(w, 'window')));
2105
1767
  windows.push(window.join(' '));
2106
1768
  }
2107
-
2108
1769
  output.push(windows.join(', '));
2109
1770
  }
2110
-
2111
1771
  if (node.sortClause) {
2112
1772
  output.push('ORDER BY');
2113
- output.push(indent(node.sortClause.map(function (e) {
1773
+ output.push(indent(unwrapList(node.sortClause).map(function (e) {
2114
1774
  return _this11.deparse(e, 'sort');
2115
1775
  }).join(",".concat(NEWLINE_CHAR))));
2116
1776
  }
2117
-
2118
1777
  if (node.limitCount) {
2119
1778
  output.push('LIMIT');
2120
1779
  output.push(indent(this.deparse(node.limitCount, context)));
2121
1780
  }
2122
-
2123
1781
  if (node.limitOffset) {
2124
1782
  output.push('OFFSET');
2125
1783
  output.push(indent(this.deparse(node.limitOffset, context)));
2126
1784
  }
2127
-
2128
1785
  if (node.lockingClause) {
2129
1786
  node.lockingClause.forEach(function (item) {
2130
1787
  return output.push(_this11.deparse(item, context));
2131
1788
  });
2132
1789
  }
2133
-
2134
1790
  return output.join(' ');
2135
1791
  }
2136
1792
  }, {
@@ -2139,15 +1795,12 @@ var Deparser = /*#__PURE__*/function () {
2139
1795
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2140
1796
  var output = ['TRUNCATE TABLE'];
2141
1797
  output.push(this.list(node.relations, ', ', '', 'truncate'));
2142
-
2143
1798
  if (node.restart_seqs) {
2144
1799
  output.push('RESTART IDENTITY');
2145
1800
  }
2146
-
2147
1801
  if (node.behavior === 'DROP_CASCADE') {
2148
1802
  output.push('CASCADE');
2149
1803
  }
2150
-
2151
1804
  return output.join(' ');
2152
1805
  }
2153
1806
  }, {
@@ -2156,27 +1809,23 @@ var Deparser = /*#__PURE__*/function () {
2156
1809
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2157
1810
  var output = [];
2158
1811
  output.push('ALTER DEFAULT PRIVILEGES');
2159
- var options = dotty.get(node, 'options');
2160
-
1812
+ var options = unwrapList(dotty.get(node, 'options'));
2161
1813
  if (options) {
2162
- var elem = node.options.find(function (el) {
1814
+ var elem = options.find(function (el) {
2163
1815
  return el.hasOwnProperty('DefElem');
2164
1816
  });
2165
-
1817
+ var elemDefElemArg = unwrapList(elem.DefElem.arg);
2166
1818
  if (elem.DefElem.defname === 'schemas') {
2167
1819
  output.push('IN SCHEMA');
2168
- output.push(dotty.get(elem, 'DefElem.arg.0.String.str'));
1820
+ output.push(elemDefElemArg[0].String.str);
2169
1821
  }
2170
-
2171
1822
  if (elem.DefElem.defname === 'roles') {
2172
1823
  output.push('FOR ROLE');
2173
- var roleSpec = dotty.get(elem, 'DefElem.arg.0');
1824
+ var roleSpec = elemDefElemArg[0];
2174
1825
  output.push(this.deparse(roleSpec, context));
2175
1826
  }
2176
-
2177
1827
  output.push(NEWLINE_CHAR);
2178
1828
  }
2179
-
2180
1829
  output.push(this.GrantStmt(node.action, context));
2181
1830
  return output.join(' ');
2182
1831
  }
@@ -2185,15 +1834,11 @@ var Deparser = /*#__PURE__*/function () {
2185
1834
  value: function AlterTableStmt(node) {
2186
1835
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2187
1836
  var output = [];
2188
-
2189
- var ctx = _objectSpread({}, context);
2190
-
1837
+ var ctx = Object.assign({}, context);
2191
1838
  output.push('ALTER');
2192
-
2193
1839
  if (node.relkind === 'OBJECT_TABLE') {
2194
1840
  output.push('TABLE');
2195
1841
  var inh = dotty.get(node, 'relation.inh');
2196
-
2197
1842
  if (!inh) {
2198
1843
  output.push('ONLY');
2199
1844
  }
@@ -2202,11 +1847,9 @@ var Deparser = /*#__PURE__*/function () {
2202
1847
  } else {
2203
1848
  fail('AlterTableStmt', node);
2204
1849
  }
2205
-
2206
1850
  if (node.missing_ok) {
2207
1851
  output.push('IF EXISTS');
2208
1852
  }
2209
-
2210
1853
  ctx.alterType = node.relkind;
2211
1854
  output.push(this.RangeVar(node.relation, ctx));
2212
1855
  output.push(this.list(node.cmds, ', ', '', ctx));
@@ -2218,26 +1861,21 @@ var Deparser = /*#__PURE__*/function () {
2218
1861
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2219
1862
  var output = [];
2220
1863
  var subType = 'COLUMN';
2221
-
2222
1864
  if (context && context.alterType === 'OBJECT_TYPE') {
2223
1865
  subType = 'ATTRIBUTE';
2224
1866
  }
2225
-
2226
1867
  if (node.subtype === 'AT_AddColumn') {
2227
1868
  output.push('ADD');
2228
1869
  output.push(subType);
2229
-
2230
1870
  if (node.missing_ok) {
2231
1871
  output.push('IF NOT EXISTS');
2232
1872
  }
2233
-
2234
1873
  output.push(this.quote(node.name));
2235
1874
  output.push(this.deparse(node.def, context));
2236
1875
  } else if (node.subtype === 'AT_ColumnDefault') {
2237
1876
  output.push('ALTER');
2238
1877
  output.push(subType);
2239
1878
  output.push(this.quote(node.name));
2240
-
2241
1879
  if (node.def) {
2242
1880
  output.push('SET DEFAULT');
2243
1881
  output.push(this.deparse(node.def, context));
@@ -2271,7 +1909,6 @@ var Deparser = /*#__PURE__*/function () {
2271
1909
  output.push('ALTER');
2272
1910
  output.push(this.quote(node.name));
2273
1911
  output.push('SET STORAGE');
2274
-
2275
1912
  if (node.def) {
2276
1913
  output.push(this.deparse(node.def, context));
2277
1914
  } else {
@@ -2280,11 +1917,9 @@ var Deparser = /*#__PURE__*/function () {
2280
1917
  } else if (node.subtype === 'AT_DropColumn') {
2281
1918
  output.push('DROP');
2282
1919
  output.push(subType);
2283
-
2284
1920
  if (node.missing_ok) {
2285
1921
  output.push('IF EXISTS');
2286
1922
  }
2287
-
2288
1923
  output.push(this.quote(node.name));
2289
1924
  } else if (node.subtype === 'AT_AddConstraint') {
2290
1925
  // output.push('ADD CONSTRAINT');
@@ -2295,11 +1930,9 @@ var Deparser = /*#__PURE__*/function () {
2295
1930
  output.push(this.quote(node.name, context));
2296
1931
  } else if (node.subtype === 'AT_DropConstraint') {
2297
1932
  output.push('DROP CONSTRAINT');
2298
-
2299
1933
  if (node.missing_ok) {
2300
1934
  output.push('IF EXISTS');
2301
1935
  }
2302
-
2303
1936
  output.push(this.quote(node.name));
2304
1937
  } else if (node.subtype === 'AT_AlterColumnType') {
2305
1938
  output.push('ALTER');
@@ -2345,7 +1978,8 @@ var Deparser = /*#__PURE__*/function () {
2345
1978
  output.push('OF');
2346
1979
  output.push(this.deparse(node.def, context));
2347
1980
  } else if (node.subtype === 'AT_DropOf') {
2348
- output.push('NOT OF'); //output.push(this.deparse(node.def));
1981
+ output.push('NOT OF');
1982
+ //output.push(this.deparse(node.def));
2349
1983
  } else if (node.subtype === 'AT_EnableRowSecurity') {
2350
1984
  output.push('ENABLE ROW LEVEL SECURITY');
2351
1985
  } else if (node.subtype === 'AT_DisableRowSecurity') {
@@ -2355,11 +1989,9 @@ var Deparser = /*#__PURE__*/function () {
2355
1989
  } else if (node.subtype === 'AT_NoForceRowSecurity') {
2356
1990
  output.push('NO FORCE ROW SECURITY');
2357
1991
  }
2358
-
2359
1992
  if (node.behavior === 'DROP_CASCADE') {
2360
1993
  output.push('CASCADE');
2361
1994
  }
2362
-
2363
1995
  return output.join(' ');
2364
1996
  }
2365
1997
  }, {
@@ -2371,7 +2003,7 @@ var Deparser = /*#__PURE__*/function () {
2371
2003
  output.push(this.list(node.typeName, '.', '', context));
2372
2004
  output.push('AS ENUM');
2373
2005
  output.push("(".concat(NEWLINE_CHAR));
2374
- var vals = node.vals.map(function (val) {
2006
+ var vals = unwrapList(node.vals).map(function (val) {
2375
2007
  return {
2376
2008
  String: {
2377
2009
  str: "'".concat(val.String.str, "'")
@@ -2394,29 +2026,23 @@ var Deparser = /*#__PURE__*/function () {
2394
2026
  }
2395
2027
  };
2396
2028
  output.push(this.deparse(typObj, context));
2397
-
2398
2029
  if (node.newVal) {
2399
2030
  output.push('ADD VALUE');
2400
2031
  var result = node.newVal.replace(/'/g, "''");
2401
2032
  output.push("'".concat(result, "'"));
2402
2033
  }
2403
-
2404
2034
  if (node.newValNeighbor) {
2405
2035
  if (node.newValIsAfter) {
2406
2036
  output.push('AFTER');
2407
2037
  } else {
2408
2038
  output.push('BEFORE');
2409
2039
  }
2410
-
2411
2040
  var _result = node.newValNeighbor.replace(/'/g, "''");
2412
-
2413
2041
  output.push("'".concat(_result, "'"));
2414
2042
  }
2415
-
2416
2043
  if (node.behavior === 'DROP_CASCADE') {
2417
2044
  output.push('CASCADE');
2418
2045
  }
2419
-
2420
2046
  return output.join(' ');
2421
2047
  }
2422
2048
  }, {
@@ -2431,7 +2057,6 @@ var Deparser = /*#__PURE__*/function () {
2431
2057
  }
2432
2058
  };
2433
2059
  output.push(this.deparse(typObj, context));
2434
-
2435
2060
  if (node.subtype === 'C') {
2436
2061
  output.push('ADD');
2437
2062
  output.push(this.deparse(node.def, context));
@@ -2444,40 +2069,32 @@ var Deparser = /*#__PURE__*/function () {
2444
2069
  output.push('CONSTRAINT');
2445
2070
  output.push(this.quote(node.name));
2446
2071
  }
2447
-
2448
2072
  if (node.behavior === 'DROP_CASCADE') {
2449
2073
  output.push('CASCADE');
2450
2074
  }
2451
-
2452
2075
  return output.join(' ');
2453
2076
  }
2454
2077
  }, {
2455
2078
  key: 'CreateExtensionStmt',
2456
2079
  value: function CreateExtensionStmt(node) {
2457
2080
  var _this12 = this;
2458
-
2459
2081
  var output = [];
2460
2082
  output.push('CREATE EXTENSION');
2461
-
2462
2083
  if (node.if_not_exists) {
2463
2084
  output.push('IF NOT EXISTS');
2464
2085
  }
2465
-
2466
2086
  output.push(this.quote(node.extname));
2467
-
2468
2087
  if (node.options) {
2469
2088
  node.options.forEach(function (opt) {
2470
2089
  if (opt.DefElem.defname === 'cascade' && opt.DefElem.arg.Integer.ival === 1) {
2471
2090
  output.push('CASCADE');
2472
2091
  }
2473
-
2474
2092
  if (opt.DefElem.defname === 'schema') {
2475
2093
  output.push('WITH SCHEMA');
2476
2094
  output.push(_this12.quote(_this12.deparse(opt.DefElem.arg)));
2477
2095
  }
2478
2096
  });
2479
2097
  }
2480
-
2481
2098
  return output.join(' ');
2482
2099
  }
2483
2100
  }, {
@@ -2487,17 +2104,14 @@ var Deparser = /*#__PURE__*/function () {
2487
2104
  var output = [];
2488
2105
  output.push('DROP');
2489
2106
  output.push((0, _pgsqlEnums.objtypeName)(node.removeType));
2490
-
2491
2107
  if (node.missing_ok) {
2492
2108
  output.push('IF EXISTS');
2493
2109
  }
2494
-
2495
2110
  var stmts = [];
2496
-
2497
- for (var s = 0; s < node.objects.length; s++) {
2498
- var children = node.objects[s];
2111
+ var objects = unwrapList(node.objects);
2112
+ for (var s = 0; s < objects.length; s++) {
2113
+ var children = unwrapList(objects[s]);
2499
2114
  var stmt = [];
2500
-
2501
2115
  if (node.removeType === 'OBJECT_TABLE' || node.removeType === 'OBJECT_CONVERSION' || node.removeType === 'OBJECT_COLLATION' || node.removeType === 'OBJECT_MATVIEW' || node.removeType === 'OBJECT_INDEX' || node.removeType === 'OBJECT_FOREIGN_TABLE') {
2502
2116
  if (children.length === 1) {
2503
2117
  stmt.push(this.quote(this.deparse(children[0])));
@@ -2553,14 +2167,15 @@ var Deparser = /*#__PURE__*/function () {
2553
2167
  stmt.push(this.listQuotes(children, '.'));
2554
2168
  } else {
2555
2169
  throw new Error('bad drop value stmt: ' + JSON.stringify(node, null, 2));
2556
- } // } else if (node.removeType === 'OBJECT_OPERATOR') {
2557
-
2170
+ }
2171
+ // } else if (node.removeType === 'OBJECT_OPERATOR') {
2558
2172
  } else if (node.removeType === 'OBJECT_CAST') {
2559
2173
  stmt.push('(');
2560
2174
  stmt.push(this.deparse(children[0], context));
2561
2175
  stmt.push('AS');
2562
2176
  stmt.push(this.deparse(children[1], context));
2563
- stmt.push(')'); // } else if (node.removeType === 'OBJECT_OPERATOR') {
2177
+ stmt.push(')');
2178
+ // } else if (node.removeType === 'OBJECT_OPERATOR') {
2564
2179
  // stmt.push(this.deparse(children, 'noquotes')); // in this case children is not an array
2565
2180
  } else if (node.removeType === 'OBJECT_AGGREGATE') {
2566
2181
  stmt.push(this.deparse(children, context)); // in this case children is not an array
@@ -2579,16 +2194,12 @@ var Deparser = /*#__PURE__*/function () {
2579
2194
  } else {
2580
2195
  throw new Error('bad drop stmt: ' + JSON.stringify(node, null, 2));
2581
2196
  }
2582
-
2583
2197
  stmts.push(stmt.join(' '));
2584
2198
  }
2585
-
2586
2199
  output.push(stmts.join(','));
2587
-
2588
2200
  if (node.behavior === 'DROP_CASCADE') {
2589
2201
  output.push('CASCADE');
2590
2202
  }
2591
-
2592
2203
  return output.join(' ');
2593
2204
  }
2594
2205
  }, {
@@ -2598,40 +2209,34 @@ var Deparser = /*#__PURE__*/function () {
2598
2209
  var output = [];
2599
2210
  output.push('CREATE POLICY');
2600
2211
  output.push(this.quote(node.policy_name));
2601
-
2602
2212
  if (node.table) {
2603
2213
  output.push('ON');
2604
2214
  output.push(this.RangeVar(node.table, context));
2605
2215
  }
2606
-
2607
- if (node.permissive) {// permissive is the default!
2216
+ if (node.permissive) {
2217
+ // permissive is the default!
2608
2218
  } else {
2609
2219
  output.push('AS');
2610
2220
  output.push('RESTRICTIVE');
2611
2221
  }
2612
-
2613
2222
  if (node.cmd_name) {
2614
2223
  output.push('FOR');
2615
2224
  output.push(node.cmd_name.toUpperCase());
2616
2225
  }
2617
-
2618
2226
  output.push('TO');
2619
2227
  output.push(this.list(node.roles));
2620
-
2621
2228
  if (node.qual) {
2622
2229
  output.push('USING');
2623
2230
  output.push('(');
2624
2231
  output.push(this.deparse(node.qual, context));
2625
2232
  output.push(')');
2626
2233
  }
2627
-
2628
2234
  if (node.with_check) {
2629
2235
  output.push('WITH CHECK');
2630
2236
  output.push('(');
2631
2237
  output.push(this.deparse(node.with_check, context));
2632
2238
  output.push(')');
2633
2239
  }
2634
-
2635
2240
  return output.join(' ');
2636
2241
  }
2637
2242
  }, {
@@ -2641,29 +2246,24 @@ var Deparser = /*#__PURE__*/function () {
2641
2246
  var output = [];
2642
2247
  output.push('ALTER POLICY');
2643
2248
  output.push(this.quote(node.policy_name));
2644
-
2645
2249
  if (node.table) {
2646
2250
  output.push('ON');
2647
2251
  output.push(this.RangeVar(node.table, context));
2648
2252
  }
2649
-
2650
2253
  output.push('TO');
2651
2254
  output.push(this.list(node.roles));
2652
-
2653
2255
  if (node.qual) {
2654
2256
  output.push('USING');
2655
2257
  output.push('(');
2656
2258
  output.push(this.deparse(node.qual, context));
2657
2259
  output.push(')');
2658
2260
  }
2659
-
2660
2261
  if (node.with_check) {
2661
2262
  output.push('WITH CHECK');
2662
2263
  output.push('(');
2663
2264
  output.push(this.deparse(node.with_check, context));
2664
2265
  output.push(')');
2665
2266
  }
2666
-
2667
2267
  return output.join(' ');
2668
2268
  }
2669
2269
  }, {
@@ -2673,65 +2273,55 @@ var Deparser = /*#__PURE__*/function () {
2673
2273
  var output = [];
2674
2274
  output.push('CREATE');
2675
2275
  if (node.replace) output.push('OR REPLACE');
2676
-
2677
2276
  if (node.view.relpersistence === 't') {
2678
2277
  output.push('TEMPORARY');
2679
2278
  }
2680
-
2681
2279
  output.push('VIEW');
2682
2280
  output.push(this.RangeVar(node.view, 'view'));
2683
-
2684
2281
  if (node.aliases) {
2685
2282
  output.push('(');
2686
2283
  output.push(this.list(node.aliases, ', ', '', context));
2687
2284
  output.push(')');
2688
2285
  }
2689
-
2690
2286
  output.push('AS');
2691
2287
  output.push(this.deparse(node.query, context));
2692
-
2693
2288
  if (node.withCheckOption === 'LOCAL_CHECK_OPTION') {
2694
2289
  output.push('WITH LOCAL CHECK OPTION');
2695
2290
  } else if (node.withCheckOption === 'CASCADED_CHECK_OPTION') {
2696
2291
  output.push('WITH CASCADED CHECK OPTION');
2697
2292
  }
2698
-
2699
2293
  return output.join(' ');
2700
2294
  }
2701
2295
  }, {
2702
2296
  key: 'CreateSeqStmt',
2703
2297
  value: function CreateSeqStmt(node) {
2704
2298
  var _this13 = this;
2705
-
2706
2299
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2707
2300
  var output = [];
2708
2301
  output.push('CREATE SEQUENCE');
2709
2302
  output.push(this.RangeVar(node.sequence, context));
2710
-
2711
- if (node.options && node.options.length) {
2712
- node.options.forEach(function (opt) {
2303
+ var options = unwrapList(node.options);
2304
+ if (options && options.length) {
2305
+ options.forEach(function (opt) {
2713
2306
  output.push(_this13.deparse(opt, 'sequence'));
2714
2307
  });
2715
2308
  }
2716
-
2717
2309
  return output.join(' ');
2718
2310
  }
2719
2311
  }, {
2720
2312
  key: 'AlterSeqStmt',
2721
2313
  value: function AlterSeqStmt(node) {
2722
2314
  var _this14 = this;
2723
-
2724
2315
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2725
2316
  var output = [];
2726
2317
  output.push('ALTER SEQUENCE');
2727
2318
  output.push(this.RangeVar(node.sequence, context));
2728
-
2729
- if (node.options && node.options.length) {
2730
- node.options.forEach(function (opt) {
2319
+ var options = unwrapList(node.options);
2320
+ if (options && options.length) {
2321
+ options.forEach(function (opt) {
2731
2322
  output.push(_this14.deparse(opt, 'sequence'));
2732
2323
  });
2733
2324
  }
2734
-
2735
2325
  return output.join(' ');
2736
2326
  }
2737
2327
  }, {
@@ -2740,17 +2330,14 @@ var Deparser = /*#__PURE__*/function () {
2740
2330
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2741
2331
  var output = ['CREATE'];
2742
2332
  var relpersistence = dotty.get(node, 'into.rel.relpersistence');
2743
-
2744
2333
  if (node.relkind === 'OBJECT_MATVIEW') {
2745
2334
  output.push('MATERIALIZED VIEW');
2746
2335
  } else if (relpersistence !== 't') {
2747
2336
  output.push('TABLE');
2748
-
2749
2337
  if (node.if_not_exists) {
2750
2338
  output.push('IF NOT EXISTS');
2751
2339
  }
2752
2340
  }
2753
-
2754
2341
  output.push(this.IntoClause(node.into, context));
2755
2342
  output.push('AS');
2756
2343
  output.push(this.deparse(node.query, context));
@@ -2760,18 +2347,17 @@ var Deparser = /*#__PURE__*/function () {
2760
2347
  key: 'CreateTrigStmt',
2761
2348
  value: function CreateTrigStmt(node) {
2762
2349
  var _this15 = this;
2763
-
2764
2350
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2765
2351
  var output = [];
2766
2352
  output.push('CREATE');
2767
-
2768
2353
  if (node.isconstraint) {
2769
2354
  output.push('CONSTRAINT');
2770
2355
  }
2771
-
2772
2356
  output.push('TRIGGER');
2773
2357
  output.push(this.quote(node.trigname));
2774
- output.push(NEWLINE_CHAR); // int16 timing; BEFORE, AFTER, or INSTEAD
2358
+ output.push(NEWLINE_CHAR);
2359
+
2360
+ // int16 timing; BEFORE, AFTER, or INSTEAD
2775
2361
 
2776
2362
  if (node.timing === 64) {
2777
2363
  output.push('INSTEAD OF');
@@ -2779,13 +2365,15 @@ var Deparser = /*#__PURE__*/function () {
2779
2365
  output.push('BEFORE');
2780
2366
  } else {
2781
2367
  output.push('AFTER');
2782
- } // int16 events; "OR" of INSERT/UPDATE/DELETE/TRUNCATE
2368
+ }
2369
+
2370
+ // int16 events; "OR" of INSERT/UPDATE/DELETE/TRUNCATE
2371
+
2783
2372
  // 4 = 0b000100 (insert)
2784
2373
  // 8 = 0b001000 (delete)
2785
2374
  // 16 = 0b010000 (update)
2786
2375
  // 32 = 0b100000 (TRUNCATE)
2787
2376
 
2788
-
2789
2377
  var TRIGGER_EVENTS = {
2790
2378
  INSERT: 4,
2791
2379
  DELETE: 8,
@@ -2793,68 +2381,59 @@ var Deparser = /*#__PURE__*/function () {
2793
2381
  TRUNCATE: 32
2794
2382
  };
2795
2383
  var events = [];
2796
-
2797
2384
  if ((TRIGGER_EVENTS.INSERT & node.events) === TRIGGER_EVENTS.INSERT) {
2798
2385
  events.push('INSERT');
2799
2386
  }
2800
-
2801
2387
  if ((TRIGGER_EVENTS.UPDATE & node.events) === TRIGGER_EVENTS.UPDATE) {
2802
2388
  events.push('UPDATE');
2803
2389
  }
2804
-
2805
2390
  if ((TRIGGER_EVENTS.DELETE & node.events) === TRIGGER_EVENTS.DELETE) {
2806
2391
  events.push('DELETE');
2807
2392
  }
2808
-
2809
2393
  if ((TRIGGER_EVENTS.TRUNCATE & node.events) === TRIGGER_EVENTS.TRUNCATE) {
2810
2394
  events.push('TRUNCATE');
2811
- } // events
2812
-
2395
+ }
2813
2396
 
2814
- output.push(events.join(' OR ')); // columns
2397
+ // events
2398
+ output.push(events.join(' OR '));
2815
2399
 
2400
+ // columns
2816
2401
  if (node.columns) {
2817
2402
  output.push('OF');
2818
2403
  output.push(this.list(node.columns, ', ', '', context));
2819
- } // ON
2820
-
2404
+ }
2821
2405
 
2406
+ // ON
2822
2407
  output.push('ON');
2823
2408
  output.push(this.RangeVar(node.relation, context));
2824
2409
  output.push(NEWLINE_CHAR);
2825
-
2826
2410
  if (node.transitionRels) {
2827
2411
  output.push('REFERENCING');
2828
2412
  node.transitionRels.forEach(function (_ref) {
2829
2413
  var TriggerTransition = _ref.TriggerTransition;
2830
-
2831
2414
  if (TriggerTransition.isNew === true && TriggerTransition.isTable === true) {
2832
2415
  output.push("NEW TABLE AS ".concat(TriggerTransition.name));
2833
2416
  } else if (TriggerTransition.isNew !== true && TriggerTransition.isTable === true) {
2834
2417
  output.push("OLD TABLE AS ".concat(TriggerTransition.name));
2835
2418
  }
2836
2419
  });
2837
- } // opts
2838
-
2420
+ }
2839
2421
 
2422
+ // opts
2840
2423
  if (node.deferrable || node.initdeferred) {
2841
2424
  if (node.deferrable) {
2842
2425
  output.push('DEFERRABLE');
2843
2426
  }
2844
-
2845
2427
  if (node.deferrable) {
2846
2428
  output.push('INITIALLY DEFERRED');
2847
2429
  }
2848
-
2849
2430
  output.push(NEWLINE_CHAR);
2850
2431
  }
2851
-
2852
2432
  if (node.row) {
2853
2433
  output.push("FOR EACH ROW".concat(NEWLINE_CHAR));
2854
2434
  } else {
2855
2435
  output.push("FOR EACH STATEMENT".concat(NEWLINE_CHAR));
2856
2436
  }
2857
-
2858
2437
  if (node.whenClause) {
2859
2438
  output.push('WHEN');
2860
2439
  output.push('(');
@@ -2862,22 +2441,18 @@ var Deparser = /*#__PURE__*/function () {
2862
2441
  output.push(')');
2863
2442
  output.push(NEWLINE_CHAR);
2864
2443
  }
2865
-
2866
2444
  output.push('EXECUTE PROCEDURE');
2867
2445
  output.push(this.listQuotes(node.funcname).split(',').join('.'));
2868
2446
  output.push('(');
2869
2447
  var args = [];
2870
-
2871
2448
  if (node.args) {
2872
- args = node.args;
2873
- } // seems that it's only parsing strings?
2874
-
2875
-
2449
+ args = unwrapList(node.args);
2450
+ }
2451
+ // seems that it's only parsing strings?
2876
2452
  args = args.map(function (arg) {
2877
- if (dotty.exists(arg, 'String.str')) {
2878
- return "'".concat(dotty.get(arg, 'String.str'), "'");
2453
+ if (arg.String !== undefined && arg.String.str !== undefined) {
2454
+ return "'".concat(arg.String.str, "'");
2879
2455
  }
2880
-
2881
2456
  return _this15.deparse(arg, context);
2882
2457
  }).filter(function (a) {
2883
2458
  return a;
@@ -2895,11 +2470,9 @@ var Deparser = /*#__PURE__*/function () {
2895
2470
  output.push(this.list(node.domainname, '.', '', context));
2896
2471
  output.push('AS');
2897
2472
  output.push(this.TypeName(node.typeName, context));
2898
-
2899
2473
  if (node.constraints) {
2900
2474
  output.push(this.list(node.constraints, ', ', '', context));
2901
2475
  }
2902
-
2903
2476
  return output.join(' ');
2904
2477
  }
2905
2478
  }, {
@@ -2908,29 +2481,24 @@ var Deparser = /*#__PURE__*/function () {
2908
2481
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2909
2482
  var output = [];
2910
2483
  var relpersistence = dotty.get(node, 'relation.relpersistence');
2911
-
2912
2484
  if (relpersistence === 't') {
2913
2485
  output.push('CREATE');
2914
2486
  } else {
2915
2487
  output.push('CREATE TABLE');
2916
-
2917
2488
  if (node.if_not_exists) {
2918
2489
  output.push('IF NOT EXISTS');
2919
2490
  }
2920
2491
  }
2921
-
2922
2492
  output.push(this.RangeVar(node.relation, context));
2923
2493
  output.push("(".concat(NEWLINE_CHAR));
2924
2494
  output.push(this.list(node.tableElts, ",".concat(NEWLINE_CHAR), TAB_CHAR, context));
2925
2495
  output.push("".concat(NEWLINE_CHAR, ")"));
2926
-
2927
2496
  if (node.hasOwnProperty('inhRelations')) {
2928
2497
  output.push('INHERITS');
2929
2498
  output.push('(');
2930
2499
  output.push(this.list(node.inhRelations, ', ', '', context));
2931
2500
  output.push(')');
2932
2501
  }
2933
-
2934
2502
  if (node.options) {
2935
2503
  // TODO was this deprecated?
2936
2504
  node.options.forEach(function (opt) {
@@ -2943,7 +2511,6 @@ var Deparser = /*#__PURE__*/function () {
2943
2511
  }
2944
2512
  });
2945
2513
  }
2946
-
2947
2514
  return output.join(' ');
2948
2515
  }
2949
2516
  }, {
@@ -2951,41 +2518,35 @@ var Deparser = /*#__PURE__*/function () {
2951
2518
  value: function ConstraintStmt(node) {
2952
2519
  var output = [];
2953
2520
  var constraint = (0, _pgsqlEnums.getConstraintFromConstrType)(node.contype);
2954
-
2955
2521
  if (node.conname) {
2956
2522
  output.push('CONSTRAINT');
2957
2523
  output.push(node.conname);
2958
-
2959
2524
  if (!node.pktable) {
2960
2525
  output.push(constraint);
2961
2526
  }
2962
2527
  } else if (node.contype === 'CONSTR_IDENTITY') {
2963
2528
  // IDENTITY
2964
2529
  output.push('GENERATED');
2965
-
2966
2530
  if (node.generated_when == 'a') {
2967
2531
  output.push('ALWAYS AS');
2968
2532
  } else {
2969
2533
  output.push('BY DEFAULT AS');
2970
2534
  }
2971
-
2972
2535
  output.push('IDENTITY');
2973
-
2974
- if (node.options && node.options.length) {
2536
+ var options = unwrapList(node.options);
2537
+ if (options && options.length) {
2975
2538
  output.push('(');
2976
- output.push(this.list(node.options, ' ', '', 'generated'));
2539
+ output.push(this.list(options, ' ', '', 'generated'));
2977
2540
  output.push(')');
2978
2541
  }
2979
2542
  } else if (node.contype === 'CONSTR_GENERATED') {
2980
2543
  output.push('GENERATED');
2981
-
2982
2544
  if (node.generated_when == 'a') {
2983
2545
  output.push('ALWAYS AS');
2984
2546
  }
2985
2547
  } else {
2986
2548
  output.push(constraint);
2987
2549
  }
2988
-
2989
2550
  return output.join(' ');
2990
2551
  }
2991
2552
  }, {
@@ -2993,13 +2554,11 @@ var Deparser = /*#__PURE__*/function () {
2993
2554
  value: function ReferenceConstraint(node) {
2994
2555
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2995
2556
  var output = [];
2996
-
2997
2557
  if (node.pk_attrs && node.fk_attrs) {
2998
2558
  if (node.conname) {
2999
2559
  output.push('CONSTRAINT');
3000
2560
  output.push(node.conname);
3001
2561
  }
3002
-
3003
2562
  output.push('FOREIGN KEY');
3004
2563
  output.push('(');
3005
2564
  output.push(this.listQuotes(node.fk_attrs));
@@ -3020,7 +2579,6 @@ var Deparser = /*#__PURE__*/function () {
3020
2579
  output.push('CONSTRAINT');
3021
2580
  output.push(node.conname);
3022
2581
  }
3023
-
3024
2582
  output.push('FOREIGN KEY');
3025
2583
  output.push('(');
3026
2584
  output.push(this.listQuotes(node.fk_attrs));
@@ -3031,7 +2589,6 @@ var Deparser = /*#__PURE__*/function () {
3031
2589
  output.push(this.ConstraintStmt(node, context));
3032
2590
  output.push(this.RangeVar(node.pktable, context));
3033
2591
  }
3034
-
3035
2592
  return output.join(' ');
3036
2593
  }
3037
2594
  }, {
@@ -3039,26 +2596,24 @@ var Deparser = /*#__PURE__*/function () {
3039
2596
  value: function ExclusionConstraint(node) {
3040
2597
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3041
2598
  var output = [];
3042
-
3043
2599
  function getExclusionGroup(nde) {
3044
2600
  var _this16 = this;
3045
-
3046
- var a = nde.exclusions.map(function (excl) {
3047
- if (excl[0].IndexElem.name) {
3048
- return excl[0].IndexElem.name;
2601
+ var exclusions = unwrapList(nde.exclusions);
2602
+ var a = exclusions.map(function (excl) {
2603
+ var firstExcl = unwrapList(excl)[0];
2604
+ if (firstExcl.IndexElem.name) {
2605
+ return firstExcl.IndexElem.name;
3049
2606
  }
3050
-
3051
- return excl[0].IndexElem.expr ? _this16.deparse(excl[0].IndexElem.expr, context) : null;
2607
+ return firstExcl.IndexElem.expr ? _this16.deparse(firstExcl.IndexElem.expr, context) : null;
3052
2608
  });
3053
- var b = nde.exclusions.map(function (excl) {
3054
- return _this16.deparse(excl[1][0], context);
2609
+ var b = exclusions.map(function (excl) {
2610
+ return _this16.deparse(unwrapList(unwrapList(excl)[1])[0], context);
3055
2611
  });
3056
2612
  var stmts = a.map(function (_v, i) {
3057
2613
  return "".concat(a[i], " WITH ").concat(b[i]);
3058
2614
  });
3059
2615
  return stmts.join(', ');
3060
2616
  }
3061
-
3062
2617
  if (node.exclusions && node.access_method) {
3063
2618
  output.push('USING');
3064
2619
  output.push(node.access_method);
@@ -3066,7 +2621,6 @@ var Deparser = /*#__PURE__*/function () {
3066
2621
  output.push(getExclusionGroup.call(this, node));
3067
2622
  output.push(')');
3068
2623
  }
3069
-
3070
2624
  return output.join(' ');
3071
2625
  }
3072
2626
  }, {
@@ -3074,120 +2628,95 @@ var Deparser = /*#__PURE__*/function () {
3074
2628
  value: function Constraint(node) {
3075
2629
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3076
2630
  var output = [];
3077
-
3078
2631
  if (node.contype === 'CONSTR_FOREIGN') {
3079
2632
  output.push(this.ReferenceConstraint(node, context));
3080
2633
  } else {
3081
2634
  output.push(this.ConstraintStmt(node, context));
3082
2635
  }
3083
-
3084
2636
  if (node.keys) {
3085
2637
  output.push('(');
3086
2638
  output.push(this.listQuotes(node.keys));
3087
2639
  output.push(')');
3088
2640
  }
3089
-
3090
2641
  if (node.raw_expr) {
3091
2642
  output.push('(');
3092
2643
  output.push(this.deparse(node.raw_expr, context));
3093
2644
  output.push(')');
3094
-
3095
2645
  if (node.contype == 'CONSTR_GENERATED') {
3096
2646
  output.push('STORED');
3097
2647
  }
3098
2648
  }
3099
-
3100
2649
  if (node.fk_del_action) {
3101
2650
  switch (node.fk_del_action) {
3102
2651
  case 'r':
3103
2652
  output.push('ON DELETE RESTRICT');
3104
2653
  break;
3105
-
3106
2654
  case 'c':
3107
2655
  output.push('ON DELETE CASCADE');
3108
2656
  break;
3109
-
3110
2657
  case 'n':
3111
2658
  output.push('ON DELETE SET NULL');
3112
2659
  break;
3113
-
3114
2660
  case 'd':
3115
2661
  output.push('ON DELETE SET DEFAULT');
3116
2662
  break;
3117
-
3118
2663
  case 'a':
3119
2664
  // output.push('ON DELETE NO ACTION');
3120
2665
  break;
3121
-
3122
2666
  default:
3123
2667
  }
3124
2668
  }
3125
-
3126
2669
  if (node.fk_upd_action) {
3127
2670
  switch (node.fk_upd_action) {
3128
2671
  case 'r':
3129
2672
  output.push('ON UPDATE RESTRICT');
3130
2673
  break;
3131
-
3132
2674
  case 'c':
3133
2675
  output.push('ON UPDATE CASCADE');
3134
2676
  break;
3135
-
3136
2677
  case 'n':
3137
2678
  output.push('ON UPDATE SET NULL');
3138
2679
  break;
3139
-
3140
2680
  case 'd':
3141
2681
  output.push('ON UPDATE SET DEFAULT');
3142
2682
  break;
3143
-
3144
2683
  case 'a':
3145
2684
  // output.push('ON UPDATE NO ACTION');
3146
2685
  break;
3147
-
3148
2686
  default:
3149
2687
  }
3150
2688
  }
3151
-
3152
2689
  if (node.fk_matchtype === 'f') {
3153
2690
  output.push('MATCH FULL');
3154
2691
  }
3155
-
3156
2692
  if (node.is_no_inherit === true) {
3157
2693
  output.push('NO INHERIT');
3158
2694
  }
3159
-
3160
2695
  if (node.skip_validation === true) {
3161
2696
  output.push('NOT VALID');
3162
2697
  }
3163
-
3164
2698
  if (node.contype === 'CONSTR_EXCLUSION') {
3165
2699
  output.push(this.ExclusionConstraint(node, context));
3166
2700
  }
3167
-
3168
2701
  if (node.deferrable) {
3169
2702
  output.push('deferrable');
3170
2703
  }
3171
-
3172
2704
  return output.join(' ');
3173
2705
  }
3174
2706
  }, {
3175
2707
  key: 'AccessPriv',
3176
2708
  value: function AccessPriv(node) {
3177
2709
  var output = [];
3178
-
3179
2710
  if (node.priv_name) {
3180
2711
  output.push(node.priv_name.toUpperCase());
3181
2712
  } else {
3182
2713
  output.push('ALL');
3183
2714
  }
3184
-
3185
2715
  if (node.cols) {
3186
2716
  output.push('(');
3187
2717
  output.push(this.listQuotes(node.cols));
3188
2718
  output.push(')');
3189
2719
  }
3190
-
3191
2720
  return output.join(' ');
3192
2721
  }
3193
2722
  }, {
@@ -3196,13 +2725,10 @@ var Deparser = /*#__PURE__*/function () {
3196
2725
  switch (node.kind) {
3197
2726
  case 'VAR_SET_VALUE':
3198
2727
  return (0, _util.format)('SET %s%s = %s', node.is_local ? 'LOCAL ' : '', node.name, this.deparseNodes(node.args, 'simple').join(', '));
3199
-
3200
2728
  case 'VAR_SET_DEFAULT':
3201
2729
  return (0, _util.format)('SET %s TO DEFAULT', node.name);
3202
-
3203
2730
  case 'VAR_SET_CURRENT':
3204
2731
  return (0, _util.format)('SET %s FROM CURRENT', node.name);
3205
-
3206
2732
  case 'VAR_SET_MULTI':
3207
2733
  {
3208
2734
  var name = {
@@ -3211,13 +2737,10 @@ var Deparser = /*#__PURE__*/function () {
3211
2737
  }[node.name];
3212
2738
  return (0, _util.format)('SET %s %s', name, this.deparseNodes(node.args, 'simple').join(', '));
3213
2739
  }
3214
-
3215
2740
  case 'VAR_RESET':
3216
2741
  return (0, _util.format)('RESET %s', node.name);
3217
-
3218
2742
  case 'VAR_RESET_ALL':
3219
2743
  return 'RESET ALL';
3220
-
3221
2744
  default:
3222
2745
  return fail('VariableSetKind', node);
3223
2746
  }
@@ -3232,7 +2755,7 @@ var Deparser = /*#__PURE__*/function () {
3232
2755
  value: function FuncWithArgs(node) {
3233
2756
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3234
2757
  var output = [];
3235
- output.push(this.deparse(node.funcname[0], context));
2758
+ output.push(this.deparse(unwrapList(node.funcname)[0], context));
3236
2759
  output.push('(');
3237
2760
  output.push(this.list(node.funcargs, ', ', '', context));
3238
2761
  output.push(')');
@@ -3243,53 +2766,42 @@ var Deparser = /*#__PURE__*/function () {
3243
2766
  value: function FunctionParameter(node) {
3244
2767
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3245
2768
  var output = [];
3246
-
3247
2769
  if (node.mode === 'FUNC_PARAM_VARIADIC') {
3248
2770
  output.push('VARIADIC');
3249
2771
  }
3250
-
3251
2772
  if (node.mode === 'FUNC_PARAM_OUT') {
3252
2773
  output.push('OUT');
3253
2774
  }
3254
-
3255
2775
  if (node.mode === 'FUNC_PARAM_INOUT') {
3256
2776
  output.push('INOUT');
3257
2777
  }
3258
-
3259
2778
  output.push(node.name);
3260
2779
  output.push(this.TypeName(node.argType, context));
3261
-
3262
2780
  if (node.defexpr) {
3263
2781
  output.push('DEFAULT');
3264
2782
  output.push(this.deparse(node.defexpr, context));
3265
2783
  }
3266
-
3267
2784
  return output.join(' ');
3268
2785
  }
3269
2786
  }, {
3270
2787
  key: 'CreateFunctionStmt',
3271
2788
  value: function CreateFunctionStmt(node) {
3272
2789
  var _this17 = this;
3273
-
3274
2790
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3275
2791
  var output = [];
3276
2792
  output.push('CREATE');
3277
-
3278
2793
  if (node.replace) {
3279
2794
  output.push('OR REPLACE');
3280
2795
  }
3281
-
3282
2796
  output.push('FUNCTION');
3283
- output.push(node.funcname.map(function (name) {
2797
+ output.push(unwrapList(node.funcname).map(function (name) {
3284
2798
  return _this17.deparse(name, context);
3285
2799
  }).join('.'));
3286
2800
  output.push('(');
3287
2801
  var parameters = [];
3288
-
3289
2802
  if (node.parameters) {
3290
- parameters = (0, _toConsumableArray2["default"])(node.parameters);
2803
+ parameters = unwrapList(node.parameters);
3291
2804
  }
3292
-
3293
2805
  var parametersList = parameters.filter(function (_ref2) {
3294
2806
  var FunctionParameter = _ref2.FunctionParameter;
3295
2807
  return FunctionParameter.mode === 'FUNC_PARAM_VARIADIC' || FunctionParameter.mode === 'FUNC_PARAM_OUT' || FunctionParameter.mode === 'FUNC_PARAM_INOUT' || FunctionParameter.mode === 'FUNC_PARAM_IN';
@@ -3300,7 +2812,6 @@ var Deparser = /*#__PURE__*/function () {
3300
2812
  var FunctionParameter = _ref3.FunctionParameter;
3301
2813
  return FunctionParameter.mode === 'FUNC_PARAM_TABLE';
3302
2814
  });
3303
-
3304
2815
  if (returns.length > 0) {
3305
2816
  output.push('RETURNS');
3306
2817
  output.push('TABLE');
@@ -3311,73 +2822,55 @@ var Deparser = /*#__PURE__*/function () {
3311
2822
  output.push('RETURNS');
3312
2823
  output.push(this.TypeName(node.returnType, context));
3313
2824
  }
3314
-
3315
2825
  node.options.forEach(function (option, i) {
3316
2826
  if (option && option.DefElem) {
3317
2827
  var value = '';
3318
-
3319
2828
  switch (option.DefElem.defname) {
3320
2829
  case 'as':
3321
- value = _this17.deparse(option.DefElem.arg[0], context);
2830
+ value = _this17.deparse(unwrapList(option.DefElem.arg)[0], context);
3322
2831
  output.push("AS $EOFCODE$".concat(value, "$EOFCODE$"));
3323
2832
  break;
3324
-
3325
2833
  case 'language':
3326
2834
  value = _this17.deparse(option.DefElem.arg, context);
3327
2835
  output.push('LANGUAGE');
3328
2836
  output.push(value);
3329
2837
  break;
3330
-
3331
2838
  case 'security':
3332
2839
  output.push('SECURITY');
3333
2840
  value = Number(option.DefElem.arg.Integer.ival);
3334
-
3335
2841
  if (value > 0) {
3336
2842
  output.push('DEFINER');
3337
2843
  } else {
3338
2844
  output.push('INVOKER');
3339
2845
  }
3340
-
3341
2846
  break;
3342
-
3343
2847
  case 'leakproof':
3344
2848
  value = Number(option.DefElem.arg.Integer.ival);
3345
-
3346
2849
  if (value > 0) {
3347
2850
  output.push('LEAKPROOF');
3348
2851
  }
3349
-
3350
2852
  break;
3351
-
3352
2853
  case 'window':
3353
2854
  value = Number(option.DefElem.arg.Integer.ival);
3354
-
3355
2855
  if (value > 0) {
3356
2856
  output.push('WINDOW');
3357
2857
  }
3358
-
3359
2858
  break;
3360
-
3361
2859
  case 'strict':
3362
2860
  value = Number(option.DefElem.arg.Integer.ival);
3363
-
3364
2861
  if (value > 0) {
3365
2862
  output.push('STRICT');
3366
2863
  } else {
3367
2864
  output.push('CALLED ON NULL INPUT');
3368
2865
  }
3369
-
3370
2866
  break;
3371
-
3372
2867
  case 'set':
3373
2868
  output.push(_this17.deparse(option, context));
3374
2869
  break;
3375
-
3376
2870
  case 'volatility':
3377
2871
  value = _this17.deparse(option.DefElem.arg, context);
3378
2872
  output.push(value.toUpperCase());
3379
2873
  break;
3380
-
3381
2874
  default:
3382
2875
  }
3383
2876
  }
@@ -3389,17 +2882,13 @@ var Deparser = /*#__PURE__*/function () {
3389
2882
  value: function CreateSchemaStmt(node) {
3390
2883
  var output = [];
3391
2884
  output.push('CREATE');
3392
-
3393
2885
  if (node.replace) {
3394
2886
  output.push('OR REPLACE');
3395
2887
  }
3396
-
3397
2888
  output.push('SCHEMA');
3398
-
3399
2889
  if (node.if_not_exists) {
3400
2890
  output.push('IF NOT EXISTS');
3401
2891
  }
3402
-
3403
2892
  output.push(node.schemaname);
3404
2893
  return output.join(' ');
3405
2894
  }
@@ -3409,16 +2898,12 @@ var Deparser = /*#__PURE__*/function () {
3409
2898
  switch (node.roletype) {
3410
2899
  case 'ROLESPEC_CSTRING':
3411
2900
  return this.quote(node.rolename);
3412
-
3413
2901
  case 'ROLESPEC_CURRENT_USER':
3414
2902
  return 'CURRENT_USER';
3415
-
3416
2903
  case 'ROLESPEC_SESSION_USER':
3417
2904
  return 'SESSION_USER';
3418
-
3419
2905
  case 'ROLESPEC_PUBLIC':
3420
2906
  return 'PUBLIC';
3421
-
3422
2907
  default:
3423
2908
  return fail('RoleSpec', node);
3424
2909
  }
@@ -3427,91 +2912,67 @@ var Deparser = /*#__PURE__*/function () {
3427
2912
  key: 'GrantStmt',
3428
2913
  value: function GrantStmt(node) {
3429
2914
  var output = [];
3430
-
3431
2915
  var getTypeFromNode = function getTypeFromNode(nodeObj) {
3432
2916
  switch (nodeObj.objtype) {
3433
2917
  case 'OBJECT_TABLE':
3434
2918
  if (nodeObj.targtype === 'ACL_TARGET_ALL_IN_SCHEMA') {
3435
2919
  return 'ALL TABLES IN SCHEMA';
3436
2920
  }
3437
-
3438
2921
  if (nodeObj.targtype === 'ACL_TARGET_DEFAULTS') {
3439
2922
  return 'TABLES';
3440
- } // todo could be view
3441
-
3442
-
2923
+ }
2924
+ // todo could be view
3443
2925
  return 'TABLE';
3444
-
3445
2926
  case 'OBJECT_SEQUENCE':
3446
2927
  if (nodeObj.targtype === 'ACL_TARGET_ALL_IN_SCHEMA') {
3447
2928
  return 'ALL SEQUENCES IN SCHEMA';
3448
2929
  }
3449
-
3450
2930
  if (nodeObj.targtype === 'ACL_TARGET_DEFAULTS') {
3451
2931
  return 'SEQUENCES';
3452
2932
  }
3453
-
3454
2933
  return 'SEQUENCE';
3455
-
3456
2934
  case 'OBJECT_DATABASE':
3457
2935
  return 'DATABASE';
3458
-
3459
2936
  case 'OBJECT_DOMAIN':
3460
2937
  return 'DOMAIN';
3461
-
3462
2938
  case 'OBJECT_FDW':
3463
2939
  return 'FOREIGN DATA WRAPPER';
3464
-
3465
2940
  case 'OBJECT_FOREIGN_SERVER':
3466
2941
  return 'FOREIGN SERVER';
3467
-
3468
2942
  case 'OBJECT_FUNCTION':
3469
2943
  if (nodeObj.targtype === 'ACL_TARGET_ALL_IN_SCHEMA') {
3470
2944
  return 'ALL FUNCTIONS IN SCHEMA';
3471
2945
  }
3472
-
3473
2946
  if (nodeObj.targtype === 'ACL_TARGET_DEFAULTS') {
3474
2947
  return 'FUNCTIONS';
3475
2948
  }
3476
-
3477
2949
  return 'FUNCTION';
3478
-
3479
2950
  case 'OBJECT_LANGUAGE':
3480
2951
  return 'LANGUAGE';
3481
-
3482
2952
  case 'OBJECT_LARGEOBJECT':
3483
2953
  return 'LARGE OBJECT';
3484
-
3485
2954
  case 'OBJECT_SCHEMA':
3486
2955
  return 'SCHEMA';
3487
-
3488
2956
  case 'OBJECT_TABLESPACE':
3489
2957
  return 'TABLESPACE';
3490
-
3491
2958
  case 'OBJECT_TYPE':
3492
2959
  return 'TYPE';
3493
-
3494
2960
  default:
3495
2961
  }
3496
-
3497
2962
  return fail('GrantStmt', node);
3498
2963
  };
3499
-
3500
2964
  if (node.objtype !== 'OBJECT_COLUMN') {
3501
2965
  if (!node.is_grant) {
3502
2966
  output.push('REVOKE');
3503
-
3504
2967
  if (node.grant_option) {
3505
2968
  output.push('GRANT OPTION');
3506
2969
  output.push('FOR');
3507
2970
  }
3508
-
3509
2971
  if (node.privileges) {
3510
2972
  output.push(this.list(node.privileges));
3511
2973
  } else {
3512
2974
  output.push('ALL');
3513
2975
  }
3514
-
3515
2976
  output.push('ON');
3516
2977
  output.push(getTypeFromNode(node));
3517
2978
  output.push(this.list(node.objects));
@@ -3519,29 +2980,24 @@ var Deparser = /*#__PURE__*/function () {
3519
2980
  output.push(this.list(node.grantees));
3520
2981
  } else {
3521
2982
  output.push('GRANT');
3522
-
3523
2983
  if (node.privileges) {
3524
2984
  output.push(this.list(node.privileges));
3525
2985
  } else {
3526
2986
  output.push('ALL');
3527
2987
  }
3528
-
3529
2988
  output.push('ON');
3530
2989
  output.push(getTypeFromNode(node));
3531
2990
  output.push(this.list(node.objects));
3532
2991
  output.push('TO');
3533
2992
  output.push(this.list(node.grantees));
3534
-
3535
2993
  if (node.grant_option) {
3536
2994
  output.push('WITH GRANT OPTION');
3537
2995
  }
3538
2996
  }
3539
-
3540
2997
  if (node.behavior === 'DROP_CASCADE') {
3541
2998
  output.push('CASCADE');
3542
2999
  }
3543
3000
  }
3544
-
3545
3001
  return output.join(' ');
3546
3002
  }
3547
3003
  }, {
@@ -3549,7 +3005,6 @@ var Deparser = /*#__PURE__*/function () {
3549
3005
  value: function GrantRoleStmt(node) {
3550
3006
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3551
3007
  var output = [];
3552
-
3553
3008
  if (!node.is_grant) {
3554
3009
  output.push('REVOKE');
3555
3010
  output.push(this.list(node.granted_roles, ', ', '', context));
@@ -3561,232 +3016,181 @@ var Deparser = /*#__PURE__*/function () {
3561
3016
  output.push('TO');
3562
3017
  output.push(this.list(node.grantee_roles, ', ', '', context));
3563
3018
  }
3564
-
3565
3019
  if (node.admin_opt) {
3566
3020
  output.push('WITH ADMIN OPTION');
3567
3021
  }
3568
-
3569
3022
  return output.join(' ');
3570
3023
  }
3571
3024
  }, {
3572
3025
  key: 'CreateRoleStmt',
3573
3026
  value: function CreateRoleStmt(node) {
3574
3027
  var _this18 = this;
3575
-
3576
3028
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3577
3029
  var output = [];
3578
-
3579
3030
  var roleOption = function roleOption(nodeObj, i, val1, val2) {
3580
- var val = Number(dotty.get(nodeObj, "options.".concat(i, ".DefElem.arg.Integer.ival")));
3581
-
3031
+ var val = Number(dotty.get(unwrapList(nodeObj.options), "".concat(i, ".DefElem.arg.Integer.ival")));
3582
3032
  if (val > 0) {
3583
3033
  output.push(val1);
3584
3034
  } else {
3585
3035
  output.push(val2);
3586
3036
  }
3587
3037
  };
3588
-
3589
3038
  output.push('CREATE');
3590
-
3591
3039
  switch (node.stmt_type) {
3592
3040
  case 'ROLESTMT_USER':
3593
3041
  output.push('USER');
3594
3042
  break;
3595
-
3596
3043
  case 'ROLESTMT_GROUP':
3597
3044
  output.push('GROUP');
3598
3045
  break;
3599
-
3600
3046
  default:
3601
3047
  output.push('ROLE');
3602
3048
  }
3603
-
3604
3049
  output.push("\"".concat(node.role, "\""));
3605
-
3606
3050
  if (node.options) {
3607
- var opts = dotty.search(node, 'options.*.DefElem.defname');
3608
-
3609
- if (opts.length === 1 && opts[0] === 'addroleto') {// only one case
3051
+ var options = unwrapList(node.options);
3052
+ var opts = dotty.search(options, '*.DefElem.defname');
3053
+ if (opts.length === 1 && opts[0] === 'addroleto') {
3054
+ // only one case
3610
3055
  } else {
3611
3056
  output.push('WITH');
3612
3057
  }
3613
-
3614
3058
  opts.forEach(function (option, i) {
3615
3059
  var value = '';
3616
-
3617
3060
  switch (option) {
3618
3061
  case 'canlogin':
3619
3062
  roleOption(node, i, 'LOGIN', 'NOLOGIN');
3620
3063
  break;
3621
-
3622
3064
  case 'addroleto':
3623
3065
  output.push('IN ROLE');
3624
- output.push(dotty.search(node, "options.".concat(i, ".DefElem.arg.*.RoleSpec.rolename")).join(','));
3066
+ output.push(dotty.search(flatten(dotty.search(options, "".concat(i, ".DefElem.arg")).map(unwrapList)), '*.RoleSpec.rolename').join(','));
3625
3067
  break;
3626
-
3627
3068
  case 'password':
3628
3069
  output.push('PASSWORD');
3629
- value = dotty.get(node, "options.".concat(i, ".DefElem.arg.String.str"));
3070
+ value = dotty.get(options, "".concat(i, ".DefElem.arg.String.str"));
3630
3071
  output.push("'".concat(value, "'"));
3631
3072
  break;
3632
-
3633
3073
  case 'adminmembers':
3634
3074
  output.push('ADMIN');
3635
- output.push(_this18.list(node.options[i].DefElem.arg, ', ', '', context));
3075
+ output.push(_this18.list(options[i].DefElem.arg, ', ', '', context));
3636
3076
  break;
3637
-
3638
3077
  case 'rolemembers':
3639
3078
  output.push('USER');
3640
- output.push(_this18.list(node.options[i].DefElem.arg, ', ', '', context));
3079
+ output.push(_this18.list(options[i].DefElem.arg, ', ', '', context));
3641
3080
  break;
3642
-
3643
3081
  case 'createdb':
3644
3082
  roleOption(node, i, 'CREATEDB', 'NOCREATEDB');
3645
3083
  break;
3646
-
3647
3084
  case 'isreplication':
3648
3085
  roleOption(node, i, 'REPLICATION', 'NOREPLICATION');
3649
3086
  break;
3650
-
3651
3087
  case 'bypassrls':
3652
3088
  roleOption(node, i, 'BYPASSRLS', 'NOBYPASSRLS');
3653
3089
  break;
3654
-
3655
3090
  case 'inherit':
3656
3091
  roleOption(node, i, 'INHERIT', 'NOINHERIT');
3657
3092
  break;
3658
-
3659
3093
  case 'superuser':
3660
3094
  roleOption(node, i, 'SUPERUSER', 'NOSUPERUSER');
3661
3095
  break;
3662
-
3663
3096
  case 'createrole':
3664
3097
  roleOption(node, i, 'CREATEROLE', 'NOCREATEROLE');
3665
3098
  break;
3666
-
3667
3099
  case 'validUntil':
3668
3100
  output.push('VALID UNTIL');
3669
- value = dotty.get(node, "options.".concat(i, ".DefElem.arg.String.str"));
3101
+ value = dotty.get(options[i], "DefElem.arg.String.str");
3670
3102
  output.push("'".concat(value, "'"));
3671
3103
  break;
3672
-
3673
3104
  default:
3674
3105
  }
3675
3106
  });
3676
3107
  }
3677
-
3678
3108
  return output.join(' ');
3679
3109
  }
3680
3110
  }, {
3681
3111
  key: 'TransactionStmt',
3682
3112
  value: function TransactionStmt(node) {
3683
3113
  var _this19 = this;
3684
-
3685
3114
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3686
3115
  var output = [];
3687
-
3688
3116
  var begin = function begin(nodeOpts) {
3689
- var opts = dotty.search(nodeOpts, 'options.*.DefElem.defname');
3690
-
3117
+ var options = unwrapList(nodeOpts.options);
3118
+ var opts = options ? dotty.search(options, '*.DefElem.defname') : [];
3691
3119
  if (opts.includes('transaction_read_only')) {
3692
3120
  var index = opts.indexOf('transaction_read_only');
3693
- var obj = nodeOpts.options[index];
3121
+ var obj = options[index];
3694
3122
  var set = false;
3695
3123
  var flag = Number(_this19.deparse(dotty.get(obj, 'DefElem.arg'), context));
3696
-
3697
3124
  if (flag > 0) {
3698
3125
  set = true;
3699
3126
  }
3700
-
3701
3127
  if (set) {
3702
3128
  return 'BEGIN TRANSACTION READ ONLY';
3703
3129
  }
3704
-
3705
3130
  return 'BEGIN TRANSACTION READ WRITE';
3706
3131
  }
3707
-
3708
3132
  if (opts.includes('transaction_isolation')) {
3709
3133
  var _index = opts.indexOf('transaction_isolation');
3710
-
3711
- var _obj = nodeOpts.options[_index];
3712
-
3134
+ var _obj = options[_index];
3713
3135
  var lopts = _this19.deparse(dotty.get(_obj, 'DefElem.arg'), context).replace(/['"]+/g, '');
3714
-
3715
3136
  return "BEGIN TRANSACTION ISOLATION LEVEL ".concat(lopts.toUpperCase());
3716
3137
  }
3717
-
3718
3138
  return 'BEGIN';
3719
3139
  };
3720
-
3721
3140
  var start = function start(nodeOpts) {
3722
- var opts = dotty.search(nodeOpts, 'options.*.DefElem.defname');
3723
-
3141
+ var options = unwrapList(nodeOpts.options);
3142
+ var opts = options ? dotty.search(options, '*.DefElem.defname') : [];
3724
3143
  if (opts.includes('transaction_read_only')) {
3725
3144
  var index = opts.indexOf('transaction_read_only');
3726
- var obj = nodeOpts.options[index];
3145
+ var obj = options[index];
3727
3146
  var set = false;
3728
3147
  var flag = Number(_this19.deparse(dotty.get(obj, 'DefElem.arg'), context));
3729
-
3730
3148
  if (flag > 0) {
3731
3149
  set = true;
3732
3150
  }
3733
-
3734
3151
  if (set) {
3735
3152
  return 'START TRANSACTION READ ONLY';
3736
3153
  }
3737
-
3738
3154
  return 'START TRANSACTION READ WRITE';
3739
3155
  }
3740
-
3741
3156
  return 'START TRANSACTION';
3742
3157
  };
3743
-
3158
+ var nodeOptions = unwrapList(node.options);
3744
3159
  switch (node.kind) {
3745
3160
  case 'TRANS_STMT_BEGIN':
3746
3161
  return begin(node);
3747
-
3748
3162
  case 'TRANS_STMT_START':
3749
3163
  return start(node);
3750
-
3751
3164
  case 'TRANS_STMT_COMMIT':
3752
3165
  return 'COMMIT';
3753
-
3754
3166
  case 'TRANS_STMT_ROLLBACK':
3755
3167
  return 'ROLLBACK';
3756
-
3757
3168
  case 'TRANS_STMT_SAVEPOINT':
3758
3169
  output.push('SAVEPOINT');
3759
- output.push(this.deparse(node.options[0].DefElem.arg, context));
3170
+ output.push(this.deparse(nodeOptions[0].DefElem.arg, context));
3760
3171
  break;
3761
-
3762
3172
  case 'TRANS_STMT_RELEASE':
3763
3173
  output.push('RELEASE SAVEPOINT');
3764
- output.push(this.deparse(node.options[0].DefElem.arg, context));
3174
+ output.push(this.deparse(nodeOptions[0].DefElem.arg, context));
3765
3175
  break;
3766
-
3767
3176
  case 'TRANS_STMT_ROLLBACK_TO':
3768
3177
  output.push('ROLLBACK TO');
3769
- output.push(this.deparse(node.options[0].DefElem.arg, context));
3178
+ output.push(this.deparse(nodeOptions[0].DefElem.arg, context));
3770
3179
  break;
3771
-
3772
3180
  case 'TRANS_STMT_PREPARE':
3773
3181
  output.push('PREPARE TRANSACTION');
3774
3182
  output.push("'".concat(node.gid, "'"));
3775
3183
  break;
3776
-
3777
3184
  case 'TRANS_STMT_COMMIT_PREPARED':
3778
3185
  output.push('COMMIT PREPARED');
3779
3186
  output.push("'".concat(node.gid, "'"));
3780
3187
  break;
3781
-
3782
3188
  case 'TRANS_STMT_ROLLBACK_PREPARED':
3783
3189
  output.push('ROLLBACK PREPARED');
3784
3190
  output.push("'".concat(node.gid, "'"));
3785
3191
  break;
3786
-
3787
3192
  default:
3788
3193
  }
3789
-
3790
3194
  return output.join(' ');
3791
3195
  }
3792
3196
  }, {
@@ -3795,65 +3199,53 @@ var Deparser = /*#__PURE__*/function () {
3795
3199
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3796
3200
  var output = [];
3797
3201
  output.push(this.deparse(node.node, context));
3798
-
3799
3202
  switch (node.sortby_dir) {
3800
3203
  case 'SORTBY_ASC':
3801
3204
  output.push('ASC');
3802
3205
  break;
3803
-
3804
3206
  case 'SORTBY_DESC':
3805
3207
  output.push('DESC');
3806
3208
  break;
3807
-
3808
3209
  case 'SORTBY_USING':
3809
3210
  output.push("USING ".concat(this.deparseNodes(node.useOp, context)));
3810
3211
  break;
3811
-
3812
3212
  case 'SORTBY_DEFAULT':
3813
3213
  break;
3814
-
3815
3214
  default:
3816
3215
  return fail('SortBy', node);
3817
3216
  }
3818
-
3819
3217
  if (node.sortby_nulls === 'SORTBY_NULLS_FIRST') {
3820
3218
  output.push('NULLS FIRST');
3821
3219
  }
3822
-
3823
3220
  if (node.sortby_nulls === 'SORTBY_NULLS_LAST') {
3824
3221
  output.push('NULLS LAST');
3825
3222
  }
3826
-
3827
3223
  return output.join(' ');
3828
3224
  }
3829
3225
  }, {
3830
3226
  key: 'ObjectWithArgs',
3831
3227
  value: function ObjectWithArgs(node) {
3832
3228
  var _this20 = this;
3833
-
3834
3229
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3835
3230
  var output = [];
3836
-
3837
3231
  if (context === 'noquotes') {
3838
3232
  output.push(this.list(node.objname, ', ', '', context));
3839
3233
  } else {
3840
3234
  output.push(this.listQuotes(node.objname, '.'));
3841
3235
  }
3842
-
3843
- if (node.objargs && node.objargs.length) {
3236
+ var objargs = unwrapList(node.objargs);
3237
+ if (objargs && objargs.length) {
3844
3238
  output.push('(');
3845
- output.push(node.objargs.map(function (arg) {
3239
+ output.push(objargs.map(function (arg) {
3846
3240
  if (isEmptyObject(arg)) {
3847
3241
  return 'NONE';
3848
3242
  }
3849
-
3850
3243
  return _this20.deparse(arg, context);
3851
3244
  }).join(','));
3852
3245
  output.push(')');
3853
3246
  } else if (!node.args_unspecified) {
3854
3247
  output.push('()');
3855
3248
  }
3856
-
3857
3249
  return output.join(' ');
3858
3250
  }
3859
3251
  }, {
@@ -3865,35 +3257,26 @@ var Deparser = /*#__PURE__*/function () {
3865
3257
  key: 'SubLink',
3866
3258
  value: function SubLink(node) {
3867
3259
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3868
-
3869
3260
  switch (true) {
3870
3261
  case node.subLinkType === 'EXISTS_SUBLINK':
3871
3262
  return (0, _util.format)('EXISTS (%s)', this.deparse(node.subselect, context));
3872
-
3873
3263
  case node.subLinkType === 'ALL_SUBLINK':
3874
3264
  return (0, _util.format)('%s %s ALL (%s)', this.deparse(node.testexpr, context), this.deparse(node.operName[0], context), this.deparse(node.subselect, context));
3875
-
3876
3265
  case node.subLinkType === 'ANY_SUBLINK' && !(node.operName != null):
3877
3266
  return (0, _util.format)('%s IN (%s)', this.deparse(node.testexpr, context), this.deparse(node.subselect, context));
3878
-
3879
3267
  case node.subLinkType === 'ANY_SUBLINK':
3880
3268
  return (0, _util.format)('%s %s ANY (%s)', this.deparse(node.testexpr, context), this.deparse(node.operName[0], context), this.deparse(node.subselect, context));
3881
-
3882
3269
  case node.subLinkType === 'ROWCOMPARE_SUBLINK':
3883
3270
  return (0, _util.format)('%s %s (%s)', this.deparse(node.testexpr, context), this.deparse(node.operName[0], context), this.deparse(node.subselect, context));
3884
-
3885
3271
  case node.subLinkType === 'EXPR_SUBLINK':
3886
3272
  return (0, _util.format)('(%s)', this.deparse(node.subselect, context));
3887
-
3888
3273
  case node.subLinkType === 'MULTIEXPR_SUBLINK':
3889
3274
  // TODO(zhm) what is this?
3890
3275
  return fail('SubLink', node);
3891
3276
  // MULTIEXPR_SUBLINK
3892
3277
  // format('(%s)', @deparse(node.subselect))
3893
-
3894
3278
  case node.subLinkType === 'ARRAY_SUBLINK':
3895
3279
  return (0, _util.format)('ARRAY (%s)', this.deparse(node.subselect, context));
3896
-
3897
3280
  default:
3898
3281
  return fail('SubLink', node);
3899
3282
  }
@@ -3904,57 +3287,44 @@ var Deparser = /*#__PURE__*/function () {
3904
3287
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3905
3288
  var type = this.TypeName(node.typeName, context);
3906
3289
  var arg = this.deparse(node.arg, context);
3907
-
3908
- if (dotty.exists(node, 'arg.A_Expr')) {
3290
+ if (node.arg !== undefined && node.arg.A_Expr !== undefined) {
3909
3291
  arg = (0, _util.format)('(%s)', arg);
3910
3292
  }
3911
-
3912
3293
  if (type === 'boolean') {
3913
3294
  var value = dotty.get(node, 'arg.A_Const.val.String.str');
3914
-
3915
3295
  if (value === 'f') {
3916
3296
  return 'FALSE';
3917
3297
  }
3918
-
3919
3298
  if (value === 't') {
3920
3299
  return 'TRUE';
3921
3300
  }
3922
3301
  }
3923
-
3924
3302
  return (0, _util.format)('%s::%s', arg, type);
3925
3303
  }
3926
3304
  }, {
3927
3305
  key: 'TypeName',
3928
3306
  value: function TypeName(node) {
3929
3307
  var _this21 = this;
3930
-
3931
3308
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3932
-
3933
- if (_lodash["default"].last(node.names).String.str === 'interval') {
3309
+ var names = unwrapList(node.names);
3310
+ if (names[names.length - 1].String.str === 'interval') {
3934
3311
  return this.deparseInterval(node);
3935
3312
  }
3936
-
3937
3313
  var output = [];
3938
-
3939
3314
  if (node.setof) {
3940
3315
  output.push('SETOF');
3941
3316
  }
3942
-
3943
3317
  var args = null;
3944
-
3945
3318
  if (node.typmods != null) {
3946
- args = node.typmods.map(function (item) {
3319
+ args = unwrapList(node.typmods).map(function (item) {
3947
3320
  return _this21.deparse(item, context);
3948
3321
  });
3949
3322
  }
3950
-
3951
3323
  var type = [];
3952
- type.push(this.type(node.names, args && args.join(', ')));
3953
-
3324
+ type.push(this.type(names, args && args.join(', ')));
3954
3325
  if (node.arrayBounds != null) {
3955
3326
  type.push('[]');
3956
3327
  }
3957
-
3958
3328
  output.push(type.join(''));
3959
3329
  return output.join(' ');
3960
3330
  }
@@ -3972,54 +3342,44 @@ var Deparser = /*#__PURE__*/function () {
3972
3342
  key: 'WindowDef',
3973
3343
  value: function WindowDef(node) {
3974
3344
  var _this22 = this;
3975
-
3976
3345
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3977
3346
  var output = [];
3978
-
3979
3347
  if (context !== 'window') {
3980
3348
  if (node.name) {
3981
3349
  output.push(node.name);
3982
3350
  }
3983
3351
  }
3984
-
3985
3352
  var empty = !(node.partitionClause != null) && !(node.orderClause != null);
3986
3353
  var frameOptions = this.deparseFrameOptions(node.frameOptions, node.refname, node.startOffset, node.endOffset);
3987
-
3988
3354
  if (empty && context !== 'window' && !(node.name != null) && frameOptions.length === 0) {
3989
3355
  return '()';
3990
3356
  }
3991
-
3992
3357
  var windowParts = [];
3993
3358
  var useParens = false;
3994
-
3995
3359
  if (node.partitionClause) {
3996
3360
  var partition = ['PARTITION BY'];
3997
- var clause = node.partitionClause.map(function (item) {
3361
+ var clause = unwrapList(node.partitionClause).map(function (item) {
3998
3362
  return _this22.deparse(item, context);
3999
3363
  });
4000
3364
  partition.push(clause.join(', '));
4001
3365
  windowParts.push(partition.join(' '));
4002
3366
  useParens = true;
4003
3367
  }
4004
-
4005
3368
  if (node.orderClause) {
4006
3369
  windowParts.push('ORDER BY');
4007
- var orders = node.orderClause.map(function (item) {
3370
+ var orders = unwrapList(node.orderClause).map(function (item) {
4008
3371
  return _this22.deparse(item);
4009
3372
  });
4010
3373
  windowParts.push(orders.join(', '));
4011
3374
  useParens = true;
4012
3375
  }
4013
-
4014
3376
  if (frameOptions.length) {
4015
3377
  useParens = true;
4016
3378
  windowParts.push(frameOptions);
4017
3379
  }
4018
-
4019
3380
  if (useParens && context !== 'window') {
4020
3381
  return output.join(' ') + ' (' + windowParts.join(' ') + ')';
4021
3382
  }
4022
-
4023
3383
  return output.join(' ') + windowParts.join(' ');
4024
3384
  }
4025
3385
  }, {
@@ -4027,29 +3387,24 @@ var Deparser = /*#__PURE__*/function () {
4027
3387
  value: function WithClause(node) {
4028
3388
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
4029
3389
  var output = ['WITH'];
4030
-
4031
3390
  if (node.recursive) {
4032
3391
  output.push('RECURSIVE');
4033
3392
  }
4034
-
4035
3393
  output.push(this.list(node.ctes, ', ', '', context));
4036
3394
  return output.join(' ');
4037
3395
  }
4038
3396
  }, {
4039
3397
  key: 'CopyStmt',
4040
3398
  value: function CopyStmt(node) {
4041
- var _node$options;
4042
-
4043
3399
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
4044
3400
  var output = ['COPY'];
4045
3401
  output.push('(' + this.deparse(node.query, context) + ')');
4046
3402
  output.push('TO');
4047
3403
  output.push("'".concat(node.filename, "'"));
4048
-
4049
- if (((_node$options = node.options) === null || _node$options === void 0 ? void 0 : _node$options.length) > 0 && node.options[0].DefElem.defname === 'format') {
4050
- output.push("(FORMAT '".concat(this.deparse(node.options[0].DefElem.arg), "')"));
3404
+ var options = unwrapList(node.options);
3405
+ if ((options === null || options === void 0 ? void 0 : options.length) > 0 && options[0].DefElem.defname === 'format') {
3406
+ output.push("(FORMAT '".concat(this.deparse(options[0].DefElem.arg), "')"));
4051
3407
  }
4052
-
4053
3408
  return output.join(' ');
4054
3409
  }
4055
3410
  }, {
@@ -4057,75 +3412,40 @@ var Deparser = /*#__PURE__*/function () {
4057
3412
  value: function CallStmt(node) {
4058
3413
  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
4059
3414
  var output = ['CALL'];
4060
- output.push(this.deparse(node.funccall.funcname[0]));
4061
-
4062
- if (node.funccall.args && node.funccall.args.length) {
3415
+ output.push(this.deparse(unwrapList(node.funccall.funcname)[0]));
3416
+ var funccallArgs = unwrapList(node.funccall.args);
3417
+ if (funccallArgs && funccallArgs.length) {
4063
3418
  // we have arguments
4064
- output.push('(' + this.list(node.funccall.args, ', ', '', context) + ')');
3419
+ output.push('(' + this.list(funccallArgs, ', ', '', context) + ')');
4065
3420
  } else {
4066
3421
  // just close parens
4067
3422
  output.push('()');
4068
3423
  }
4069
-
4070
3424
  return output.join(' ');
4071
3425
  }
4072
3426
  }, {
4073
3427
  key: "deparseFrameOptions",
4074
3428
  value: function deparseFrameOptions(options, refName, startOffset, endOffset) {
4075
3429
  // https://github.com/pganalyze/libpg_query/blob/442b1748d06364ecd3779bc558899176c02efaf0/src/postgres/include/nodes/parsenodes.h#L505-L522
4076
- var FRAMEOPTION_NONDEFAULT = 0x00001;
4077
- /* any specified? */
4078
-
4079
- var FRAMEOPTION_RANGE = 0x00002;
4080
- /* RANGE behavior */
4081
-
4082
- var FRAMEOPTION_ROWS = 0x00004;
4083
- /* ROWS behavior */
4084
-
4085
- var FRAMEOPTION_GROUPS = 0x00008;
4086
- /* GROUPS behavior */
4087
-
4088
- var FRAMEOPTION_BETWEEN = 0x00010;
4089
- /* BETWEEN given? */
4090
-
4091
- var FRAMEOPTION_START_UNBOUNDED_PRECEDING = 0x00020;
4092
- /* start is U. P. */
4093
-
4094
- var FRAMEOPTION_END_UNBOUNDED_PRECEDING = 0x00040;
4095
- /* (disallowed) */
4096
-
4097
- var FRAMEOPTION_START_UNBOUNDED_FOLLOWING = 0x00080;
4098
- /* (disallowed) */
4099
-
4100
- var FRAMEOPTION_END_UNBOUNDED_FOLLOWING = 0x00100;
4101
- /* end is U. F. */
4102
-
4103
- var FRAMEOPTION_START_CURRENT_ROW = 0x00200;
4104
- /* start is C. R. */
4105
-
4106
- var FRAMEOPTION_END_CURRENT_ROW = 0x00400;
4107
- /* end is C. R. */
3430
+ var FRAMEOPTION_NONDEFAULT = 0x00001; /* any specified? */
3431
+ var FRAMEOPTION_RANGE = 0x00002; /* RANGE behavior */
3432
+ var FRAMEOPTION_ROWS = 0x00004; /* ROWS behavior */
3433
+ var FRAMEOPTION_GROUPS = 0x00008; /* GROUPS behavior */
3434
+ var FRAMEOPTION_BETWEEN = 0x00010; /* BETWEEN given? */
3435
+ var FRAMEOPTION_START_UNBOUNDED_PRECEDING = 0x00020; /* start is U. P. */
3436
+ var FRAMEOPTION_END_UNBOUNDED_PRECEDING = 0x00040; /* (disallowed) */
3437
+ var FRAMEOPTION_START_UNBOUNDED_FOLLOWING = 0x00080; /* (disallowed) */
3438
+ var FRAMEOPTION_END_UNBOUNDED_FOLLOWING = 0x00100; /* end is U. F. */
3439
+ var FRAMEOPTION_START_CURRENT_ROW = 0x00200; /* start is C. R. */
3440
+ var FRAMEOPTION_END_CURRENT_ROW = 0x00400; /* end is C. R. */
3441
+ var FRAMEOPTION_START_OFFSET_PRECEDING = 0x00800; /* start is O. P. */
3442
+ var FRAMEOPTION_END_OFFSET_PRECEDING = 0x01000; /* end is O. P. */
3443
+ var FRAMEOPTION_START_OFFSET_FOLLOWING = 0x02000; /* start is O. F. */
3444
+ var FRAMEOPTION_END_OFFSET_FOLLOWING = 0x04000; /* end is O. F. */
3445
+ var FRAMEOPTION_EXCLUDE_CURRENT_ROW = 0x08000; /* omit C.R. */
3446
+ var FRAMEOPTION_EXCLUDE_GROUP = 0x10000; /* omit C.R. & peers */
3447
+ var FRAMEOPTION_EXCLUDE_TIES = 0x20000; /* omit C.R.'s peers */
4108
3448
 
4109
- var FRAMEOPTION_START_OFFSET_PRECEDING = 0x00800;
4110
- /* start is O. P. */
4111
-
4112
- var FRAMEOPTION_END_OFFSET_PRECEDING = 0x01000;
4113
- /* end is O. P. */
4114
-
4115
- var FRAMEOPTION_START_OFFSET_FOLLOWING = 0x02000;
4116
- /* start is O. F. */
4117
-
4118
- var FRAMEOPTION_END_OFFSET_FOLLOWING = 0x04000;
4119
- /* end is O. F. */
4120
-
4121
- var FRAMEOPTION_EXCLUDE_CURRENT_ROW = 0x08000;
4122
- /* omit C.R. */
4123
-
4124
- var FRAMEOPTION_EXCLUDE_GROUP = 0x10000;
4125
- /* omit C.R. & peers */
4126
-
4127
- var FRAMEOPTION_EXCLUDE_TIES = 0x20000;
4128
- /* omit C.R.'s peers */
4129
3449
  // const FRAMEOPTION_START_OFFSET =
4130
3450
  // FRAMEOPTION_START_OFFSET_PRECEDING | FRAMEOPTION_START_OFFSET_FOLLOWING;
4131
3451
  // const FRAMEOPTION_END_OFFSET =
@@ -4134,6 +3454,7 @@ var Deparser = /*#__PURE__*/function () {
4134
3454
  // FRAMEOPTION_EXCLUDE_CURRENT_ROW |
4135
3455
  // FRAMEOPTION_EXCLUDE_GROUP |
4136
3456
  // FRAMEOPTION_EXCLUDE_TIES;
3457
+
4137
3458
  // const FRAMEOPTION_DEFAULTS =
4138
3459
  // FRAMEOPTION_RANGE |
4139
3460
  // FRAMEOPTION_START_UNBOUNDED_PRECEDING |
@@ -4142,105 +3463,83 @@ var Deparser = /*#__PURE__*/function () {
4142
3463
  if (!(options & FRAMEOPTION_NONDEFAULT)) {
4143
3464
  return '';
4144
3465
  }
4145
-
4146
3466
  var output = [];
4147
-
4148
3467
  if (refName != null) {
4149
3468
  output.push(refName);
4150
3469
  }
4151
-
4152
3470
  if (options & FRAMEOPTION_RANGE) {
4153
3471
  output.push('RANGE');
4154
3472
  }
4155
-
4156
3473
  if (options & FRAMEOPTION_ROWS) {
4157
3474
  output.push('ROWS');
4158
3475
  }
4159
-
4160
3476
  var between = options & FRAMEOPTION_BETWEEN;
4161
-
4162
3477
  if (between) {
4163
3478
  output.push('BETWEEN');
4164
3479
  }
4165
-
4166
3480
  if (options & FRAMEOPTION_START_UNBOUNDED_PRECEDING) {
4167
3481
  output.push('UNBOUNDED PRECEDING');
4168
3482
  }
4169
-
4170
3483
  if (options & FRAMEOPTION_START_UNBOUNDED_FOLLOWING) {
4171
3484
  output.push('UNBOUNDED FOLLOWING');
4172
3485
  }
4173
-
4174
3486
  if (options & FRAMEOPTION_START_CURRENT_ROW) {
4175
3487
  output.push('CURRENT ROW');
4176
3488
  }
4177
-
4178
3489
  if (options & FRAMEOPTION_START_OFFSET_PRECEDING) {
4179
3490
  output.push(this.deparse(startOffset) + ' PRECEDING');
4180
3491
  }
4181
-
4182
3492
  if (options & FRAMEOPTION_START_OFFSET_FOLLOWING) {
4183
3493
  output.push(this.deparse(startOffset) + ' FOLLOWING');
4184
3494
  }
4185
-
4186
3495
  if (between) {
4187
3496
  output.push('AND');
4188
-
4189
3497
  if (options & FRAMEOPTION_END_UNBOUNDED_PRECEDING) {
4190
3498
  output.push('UNBOUNDED PRECEDING');
4191
3499
  }
4192
-
4193
3500
  if (options & FRAMEOPTION_END_UNBOUNDED_FOLLOWING) {
4194
3501
  output.push('UNBOUNDED FOLLOWING');
4195
3502
  }
4196
-
4197
3503
  if (options & FRAMEOPTION_END_CURRENT_ROW) {
4198
3504
  output.push('CURRENT ROW');
4199
3505
  }
4200
-
4201
3506
  if (options & FRAMEOPTION_END_OFFSET_PRECEDING) {
4202
3507
  output.push(this.deparse(endOffset) + ' PRECEDING');
4203
3508
  }
4204
-
4205
3509
  if (options & FRAMEOPTION_END_OFFSET_FOLLOWING) {
4206
3510
  output.push(this.deparse(endOffset) + ' FOLLOWING');
4207
3511
  }
4208
3512
  }
4209
-
4210
3513
  return output.join(' ');
4211
3514
  }
4212
3515
  }, {
4213
3516
  key: "deparseInterval",
4214
3517
  value: function deparseInterval(node) {
4215
3518
  var _this23 = this;
4216
-
4217
3519
  var type = ['interval'];
4218
-
4219
3520
  if (node.arrayBounds != null) {
4220
3521
  type.push('[]');
4221
3522
  }
4222
-
4223
3523
  if (node.typmods) {
4224
- var typmods = node.typmods.map(function (item) {
3524
+ var nodeTypmods = unwrapList(node.typmods);
3525
+ var typmods = nodeTypmods.map(function (item) {
4225
3526
  return _this23.deparse(item);
4226
3527
  });
4227
- var intervals = this.interval(typmods[0]); // SELECT interval(0) '1 day 01:23:45.6789'
3528
+ var intervals = this.interval(typmods[0]);
4228
3529
 
4229
- 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) {
4230
- intervals = ["(".concat(node.typmods[1].A_Const.val.Integer.ival, ")")];
3530
+ // SELECT interval(0) '1 day 01:23:45.6789'
3531
+ if (nodeTypmods[0] && nodeTypmods[0].A_Const && nodeTypmods[0].A_Const.val.Integer.ival === 32767 && nodeTypmods[1] && nodeTypmods[1].A_Const != null) {
3532
+ intervals = ["(".concat(nodeTypmods[1].A_Const.val.Integer.ival, ")")];
4231
3533
  } else {
4232
- intervals = intervals.map(function (part) {
3534
+ intervals = unwrapList(intervals).map(function (part) {
4233
3535
  if (part === 'second' && typmods.length === 2) {
4234
- return 'second(' + _lodash["default"].last(typmods) + ')';
3536
+ return 'second(' + typmods[typmods.length - 1] + ')';
4235
3537
  }
4236
-
4237
3538
  return part;
4238
3539
  });
4239
3540
  }
4240
-
4241
3541
  type.push(intervals.join(' to '));
4242
3542
  }
4243
-
4244
3543
  return type.join(' ');
4245
3544
  }
4246
3545
  }, {
@@ -4280,11 +3579,9 @@ var Deparser = /*#__PURE__*/function () {
4280
3579
  28: 'DTZMOD'
4281
3580
  };
4282
3581
  }
4283
-
4284
3582
  if (this.BITS == null) {
4285
- this.BITS = _lodash["default"].invert(this.MASKS);
3583
+ this.BITS = inverted(this.MASKS);
4286
3584
  }
4287
-
4288
3585
  if (this.INTERVALS == null) {
4289
3586
  this.INTERVALS = {};
4290
3587
  this.INTERVALS[1 << this.BITS.YEAR] = ['year'];
@@ -4299,12 +3596,12 @@ var Deparser = /*#__PURE__*/function () {
4299
3596
  this.INTERVALS[1 << this.BITS.DAY | 1 << this.BITS.HOUR | 1 << this.BITS.MINUTE | 1 << this.BITS.SECOND] = ['day', 'second'];
4300
3597
  this.INTERVALS[1 << this.BITS.HOUR | 1 << this.BITS.MINUTE] = ['hour', 'minute'];
4301
3598
  this.INTERVALS[1 << this.BITS.HOUR | 1 << this.BITS.MINUTE | 1 << this.BITS.SECOND] = ['hour', 'second'];
4302
- this.INTERVALS[1 << this.BITS.MINUTE | 1 << this.BITS.SECOND] = ['minute', 'second']; // utils/timestamp.h
4303
- // #define INTERVAL_FULL_RANGE (0x7FFF)
3599
+ this.INTERVALS[1 << this.BITS.MINUTE | 1 << this.BITS.SECOND] = ['minute', 'second'];
4304
3600
 
3601
+ // utils/timestamp.h
3602
+ // #define INTERVAL_FULL_RANGE (0x7FFF)
4305
3603
  this.INTERVALS[this.INTERVAL_FULL_RANGE = '32767'] = [];
4306
3604
  }
4307
-
4308
3605
  return this.INTERVALS[mask.toString()];
4309
3606
  }
4310
3607
  }], [{
@@ -4315,5 +3612,4 @@ var Deparser = /*#__PURE__*/function () {
4315
3612
  }]);
4316
3613
  return Deparser;
4317
3614
  }();
4318
-
4319
3615
  exports["default"] = Deparser;