pgsql-deparser 17.10.0 → 17.12.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/deparser.d.ts CHANGED
@@ -56,6 +56,11 @@ export declare class Deparser implements DeparserVisitor {
56
56
  * @returns The delimiter to use
57
57
  */
58
58
  private getFunctionDelimiter;
59
+ /**
60
+ * Maps ObjectType enum values to their corresponding SQL keywords
61
+ * Used by AlterOwnerStmt, AlterObjectSchemaStmt, and other statements that need object type keywords
62
+ */
63
+ private getObjectTypeKeyword;
59
64
  deparse(node: Node, context?: DeparserContext): string | null;
60
65
  visit(node: Node, context?: DeparserContext): string;
61
66
  getNodeType(node: Node): string;
@@ -170,6 +175,7 @@ export declare class Deparser implements DeparserVisitor {
170
175
  AlterTableSpaceOptionsStmt(node: t.AlterTableSpaceOptionsStmt, context: DeparserContext): string;
171
176
  CreateExtensionStmt(node: t.CreateExtensionStmt, context: DeparserContext): string;
172
177
  AlterExtensionStmt(node: t.AlterExtensionStmt, context: DeparserContext): string;
178
+ AlterExtensionContentsStmt(node: t.AlterExtensionContentsStmt, context: DeparserContext): string;
173
179
  CreateFdwStmt(node: t.CreateFdwStmt, context: DeparserContext): string;
174
180
  SetOperationStmt(node: t.SetOperationStmt, context: DeparserContext): string;
175
181
  ReplicaIdentityStmt(node: t.ReplicaIdentityStmt, context: DeparserContext): string;
package/deparser.js CHANGED
@@ -167,6 +167,120 @@ class Deparser {
167
167
  }
168
168
  return delimiter;
169
169
  }
170
+ /**
171
+ * Maps ObjectType enum values to their corresponding SQL keywords
172
+ * Used by AlterOwnerStmt, AlterObjectSchemaStmt, and other statements that need object type keywords
173
+ */
174
+ getObjectTypeKeyword(objectType) {
175
+ switch (objectType) {
176
+ case 'OBJECT_TABLE':
177
+ return 'TABLE';
178
+ case 'OBJECT_VIEW':
179
+ return 'VIEW';
180
+ case 'OBJECT_INDEX':
181
+ return 'INDEX';
182
+ case 'OBJECT_SEQUENCE':
183
+ return 'SEQUENCE';
184
+ case 'OBJECT_FUNCTION':
185
+ return 'FUNCTION';
186
+ case 'OBJECT_PROCEDURE':
187
+ return 'PROCEDURE';
188
+ case 'OBJECT_SCHEMA':
189
+ return 'SCHEMA';
190
+ case 'OBJECT_DATABASE':
191
+ return 'DATABASE';
192
+ case 'OBJECT_DOMAIN':
193
+ return 'DOMAIN';
194
+ case 'OBJECT_AGGREGATE':
195
+ return 'AGGREGATE';
196
+ case 'OBJECT_CONVERSION':
197
+ return 'CONVERSION';
198
+ case 'OBJECT_LANGUAGE':
199
+ return 'LANGUAGE';
200
+ case 'OBJECT_OPERATOR':
201
+ return 'OPERATOR';
202
+ case 'OBJECT_OPFAMILY':
203
+ return 'OPERATOR FAMILY';
204
+ case 'OBJECT_OPCLASS':
205
+ return 'OPERATOR CLASS';
206
+ case 'OBJECT_TSDICTIONARY':
207
+ return 'TEXT SEARCH DICTIONARY';
208
+ case 'OBJECT_TSCONFIGURATION':
209
+ return 'TEXT SEARCH CONFIGURATION';
210
+ case 'OBJECT_EVENT_TRIGGER':
211
+ return 'EVENT TRIGGER';
212
+ case 'OBJECT_FDW':
213
+ return 'FOREIGN DATA WRAPPER';
214
+ case 'OBJECT_FOREIGN_SERVER':
215
+ return 'SERVER';
216
+ case 'OBJECT_TYPE':
217
+ return 'TYPE';
218
+ case 'OBJECT_COLLATION':
219
+ return 'COLLATION';
220
+ case 'OBJECT_PUBLICATION':
221
+ return 'PUBLICATION';
222
+ case 'OBJECT_ACCESS_METHOD':
223
+ return 'ACCESS METHOD';
224
+ case 'OBJECT_AMOP':
225
+ return 'OPERATOR CLASS';
226
+ case 'OBJECT_AMPROC':
227
+ return 'OPERATOR CLASS';
228
+ case 'OBJECT_ATTRIBUTE':
229
+ return 'ATTRIBUTE';
230
+ case 'OBJECT_CAST':
231
+ return 'CAST';
232
+ case 'OBJECT_COLUMN':
233
+ return 'COLUMN';
234
+ case 'OBJECT_DEFAULT':
235
+ return 'DEFAULT';
236
+ case 'OBJECT_DEFACL':
237
+ return 'DEFAULT PRIVILEGES';
238
+ case 'OBJECT_DOMCONSTRAINT':
239
+ return 'DOMAIN';
240
+ case 'OBJECT_EXTENSION':
241
+ return 'EXTENSION';
242
+ case 'OBJECT_FOREIGN_TABLE':
243
+ return 'FOREIGN TABLE';
244
+ case 'OBJECT_LARGEOBJECT':
245
+ return 'LARGE OBJECT';
246
+ case 'OBJECT_MATVIEW':
247
+ return 'MATERIALIZED VIEW';
248
+ case 'OBJECT_PARAMETER_ACL':
249
+ return 'PARAMETER';
250
+ case 'OBJECT_POLICY':
251
+ return 'POLICY';
252
+ case 'OBJECT_PUBLICATION_NAMESPACE':
253
+ return 'PUBLICATION';
254
+ case 'OBJECT_PUBLICATION_REL':
255
+ return 'PUBLICATION';
256
+ case 'OBJECT_ROLE':
257
+ return 'ROLE';
258
+ case 'OBJECT_ROUTINE':
259
+ return 'ROUTINE';
260
+ case 'OBJECT_RULE':
261
+ return 'RULE';
262
+ case 'OBJECT_STATISTIC_EXT':
263
+ return 'STATISTICS';
264
+ case 'OBJECT_SUBSCRIPTION':
265
+ return 'SUBSCRIPTION';
266
+ case 'OBJECT_TABCONSTRAINT':
267
+ return 'CONSTRAINT';
268
+ case 'OBJECT_TABLESPACE':
269
+ return 'TABLESPACE';
270
+ case 'OBJECT_TRANSFORM':
271
+ return 'TRANSFORM';
272
+ case 'OBJECT_TRIGGER':
273
+ return 'TRIGGER';
274
+ case 'OBJECT_TSPARSER':
275
+ return 'TEXT SEARCH PARSER';
276
+ case 'OBJECT_TSTEMPLATE':
277
+ return 'TEXT SEARCH TEMPLATE';
278
+ case 'OBJECT_USER_MAPPING':
279
+ return 'USER MAPPING';
280
+ default:
281
+ throw new Error(`Unsupported objectType: ${objectType}`);
282
+ }
283
+ }
170
284
  deparse(node, context) {
171
285
  if (node == null) {
172
286
  return null;
@@ -2088,10 +2202,13 @@ class Deparser {
2088
2202
  const isFunctionCall = argType === 'FuncCall';
2089
2203
  if (isSimpleArgument || isFunctionCall) {
2090
2204
  // For simple arguments, avoid :: syntax if they have complex structure
2091
- if (isSimpleArgument && (arg.includes('(') || arg.startsWith('-'))) {
2092
- }
2093
- else {
2205
+ const shouldUseCastSyntax = isSimpleArgument && (arg.includes('(') || arg.startsWith('-'));
2206
+ if (!shouldUseCastSyntax) {
2094
2207
  const cleanTypeName = typeName.replace('pg_catalog.', '');
2208
+ // Wrap FuncCall arguments in parentheses to prevent operator precedence issues
2209
+ if (isFunctionCall) {
2210
+ return `${context.parens(arg)}::${cleanTypeName}`;
2211
+ }
2095
2212
  return `${arg}::${cleanTypeName}`;
2096
2213
  }
2097
2214
  }
@@ -5606,11 +5723,15 @@ class Deparser {
5606
5723
  if (context.parentNodeTypes.includes('CreateExtensionStmt') || context.parentNodeTypes.includes('AlterExtensionStmt') || context.parentNodeTypes.includes('CreateFdwStmt') || context.parentNodeTypes.includes('AlterFdwStmt')) {
5607
5724
  // AlterExtensionStmt specific cases
5608
5725
  if (context.parentNodeTypes.includes('AlterExtensionStmt')) {
5609
- if (node.defname === 'to') {
5610
- return `TO ${argValue}`;
5726
+ if (node.defname === 'new_version') {
5727
+ // argValue is unquoted due to DefElem context, so we need to quote it
5728
+ const quotedValue = typeof argValue === 'string' && !argValue.startsWith("'")
5729
+ ? `'${argValue}'`
5730
+ : argValue;
5731
+ return `UPDATE TO ${quotedValue}`;
5611
5732
  }
5612
5733
  if (node.defname === 'schema') {
5613
- return `SCHEMA ${argValue}`;
5734
+ return `SET SCHEMA ${argValue}`;
5614
5735
  }
5615
5736
  }
5616
5737
  // CreateFdwStmt specific cases
@@ -5874,6 +5995,34 @@ class Deparser {
5874
5995
  }
5875
5996
  return output.join(' ');
5876
5997
  }
5998
+ AlterExtensionContentsStmt(node, context) {
5999
+ const output = ['ALTER', 'EXTENSION'];
6000
+ if (node.extname) {
6001
+ output.push(this.quoteIfNeeded(node.extname));
6002
+ }
6003
+ // Handle action: 1 = ADD, -1 = DROP
6004
+ if (node.action === 1) {
6005
+ output.push('ADD');
6006
+ }
6007
+ else if (node.action === -1) {
6008
+ output.push('DROP');
6009
+ }
6010
+ // Add object type keyword
6011
+ if (node.objtype) {
6012
+ try {
6013
+ output.push(this.getObjectTypeKeyword(node.objtype));
6014
+ }
6015
+ catch {
6016
+ // Fallback to the raw objtype if not supported
6017
+ output.push(node.objtype.toString());
6018
+ }
6019
+ }
6020
+ // Add the object itself
6021
+ if (node.object) {
6022
+ output.push(this.visit(node.object, context));
6023
+ }
6024
+ return output.join(' ');
6025
+ }
5877
6026
  CreateFdwStmt(node, context) {
5878
6027
  const output = ['CREATE', 'FOREIGN', 'DATA', 'WRAPPER'];
5879
6028
  if (node.fdwname) {
@@ -7580,76 +7729,7 @@ class Deparser {
7580
7729
  if (!node.objectType) {
7581
7730
  throw new Error('AlterOwnerStmt requires objectType');
7582
7731
  }
7583
- switch (node.objectType) {
7584
- case 'OBJECT_TABLE':
7585
- output.push('TABLE');
7586
- break;
7587
- case 'OBJECT_VIEW':
7588
- output.push('VIEW');
7589
- break;
7590
- case 'OBJECT_INDEX':
7591
- output.push('INDEX');
7592
- break;
7593
- case 'OBJECT_SEQUENCE':
7594
- output.push('SEQUENCE');
7595
- break;
7596
- case 'OBJECT_FUNCTION':
7597
- output.push('FUNCTION');
7598
- break;
7599
- case 'OBJECT_PROCEDURE':
7600
- output.push('PROCEDURE');
7601
- break;
7602
- case 'OBJECT_SCHEMA':
7603
- output.push('SCHEMA');
7604
- break;
7605
- case 'OBJECT_DATABASE':
7606
- output.push('DATABASE');
7607
- break;
7608
- case 'OBJECT_DOMAIN':
7609
- output.push('DOMAIN');
7610
- break;
7611
- case 'OBJECT_AGGREGATE':
7612
- output.push('AGGREGATE');
7613
- break;
7614
- case 'OBJECT_CONVERSION':
7615
- output.push('CONVERSION');
7616
- break;
7617
- case 'OBJECT_LANGUAGE':
7618
- output.push('LANGUAGE');
7619
- break;
7620
- case 'OBJECT_OPERATOR':
7621
- output.push('OPERATOR');
7622
- break;
7623
- case 'OBJECT_OPFAMILY':
7624
- output.push('OPERATOR FAMILY');
7625
- break;
7626
- case 'OBJECT_OPCLASS':
7627
- output.push('OPERATOR CLASS');
7628
- break;
7629
- case 'OBJECT_TSDICTIONARY':
7630
- output.push('TEXT SEARCH DICTIONARY');
7631
- break;
7632
- case 'OBJECT_TSCONFIGURATION':
7633
- output.push('TEXT SEARCH CONFIGURATION');
7634
- break;
7635
- case 'OBJECT_EVENT_TRIGGER':
7636
- output.push('EVENT TRIGGER');
7637
- break;
7638
- case 'OBJECT_FDW':
7639
- output.push('FOREIGN DATA WRAPPER');
7640
- break;
7641
- case 'OBJECT_FOREIGN_SERVER':
7642
- output.push('SERVER');
7643
- break;
7644
- case 'OBJECT_TYPE':
7645
- output.push('TYPE');
7646
- break;
7647
- case 'OBJECT_COLLATION':
7648
- output.push('COLLATION');
7649
- break;
7650
- default:
7651
- throw new Error(`Unsupported AlterOwnerStmt objectType: ${node.objectType}`);
7652
- }
7732
+ output.push(this.getObjectTypeKeyword(node.objectType));
7653
7733
  if (node.relation) {
7654
7734
  output.push(this.RangeVar(node.relation, context));
7655
7735
  }
@@ -10167,66 +10247,12 @@ class Deparser {
10167
10247
  }
10168
10248
  AlterObjectSchemaStmt(node, context) {
10169
10249
  const output = ['ALTER'];
10170
- switch (node.objectType) {
10171
- case 'OBJECT_TABLE':
10172
- output.push('TABLE');
10173
- break;
10174
- case 'OBJECT_VIEW':
10175
- output.push('VIEW');
10176
- break;
10177
- case 'OBJECT_FUNCTION':
10178
- output.push('FUNCTION');
10179
- break;
10180
- case 'OBJECT_TYPE':
10181
- output.push('TYPE');
10182
- break;
10183
- case 'OBJECT_DOMAIN':
10184
- output.push('DOMAIN');
10185
- break;
10186
- case 'OBJECT_SEQUENCE':
10187
- output.push('SEQUENCE');
10188
- break;
10189
- case 'OBJECT_OPCLASS':
10190
- output.push('OPERATOR CLASS');
10191
- break;
10192
- case 'OBJECT_OPFAMILY':
10193
- output.push('OPERATOR FAMILY');
10194
- break;
10195
- case 'OBJECT_OPERATOR':
10196
- output.push('OPERATOR');
10197
- break;
10198
- case 'OBJECT_TYPE':
10199
- output.push('TYPE');
10200
- break;
10201
- case 'OBJECT_COLLATION':
10202
- output.push('COLLATION');
10203
- break;
10204
- case 'OBJECT_CONVERSION':
10205
- output.push('CONVERSION');
10206
- break;
10207
- case 'OBJECT_TSPARSER':
10208
- output.push('TEXT SEARCH PARSER');
10209
- break;
10210
- case 'OBJECT_TSCONFIGURATION':
10211
- output.push('TEXT SEARCH CONFIGURATION');
10212
- break;
10213
- case 'OBJECT_TSTEMPLATE':
10214
- output.push('TEXT SEARCH TEMPLATE');
10215
- break;
10216
- case 'OBJECT_TSDICTIONARY':
10217
- output.push('TEXT SEARCH DICTIONARY');
10218
- break;
10219
- case 'OBJECT_AGGREGATE':
10220
- output.push('AGGREGATE');
10221
- break;
10222
- case 'OBJECT_FOREIGN_TABLE':
10223
- output.push('FOREIGN TABLE');
10224
- break;
10225
- case 'OBJECT_MATVIEW':
10226
- output.push('MATERIALIZED VIEW');
10227
- break;
10228
- default:
10229
- output.push(node.objectType.toString());
10250
+ try {
10251
+ output.push(this.getObjectTypeKeyword(node.objectType));
10252
+ }
10253
+ catch {
10254
+ // Fallback to objectType string if not supported
10255
+ output.push(node.objectType.toString());
10230
10256
  }
10231
10257
  if (node.missing_ok) {
10232
10258
  output.push('IF EXISTS');
package/esm/deparser.js CHANGED
@@ -164,6 +164,120 @@ export class Deparser {
164
164
  }
165
165
  return delimiter;
166
166
  }
167
+ /**
168
+ * Maps ObjectType enum values to their corresponding SQL keywords
169
+ * Used by AlterOwnerStmt, AlterObjectSchemaStmt, and other statements that need object type keywords
170
+ */
171
+ getObjectTypeKeyword(objectType) {
172
+ switch (objectType) {
173
+ case 'OBJECT_TABLE':
174
+ return 'TABLE';
175
+ case 'OBJECT_VIEW':
176
+ return 'VIEW';
177
+ case 'OBJECT_INDEX':
178
+ return 'INDEX';
179
+ case 'OBJECT_SEQUENCE':
180
+ return 'SEQUENCE';
181
+ case 'OBJECT_FUNCTION':
182
+ return 'FUNCTION';
183
+ case 'OBJECT_PROCEDURE':
184
+ return 'PROCEDURE';
185
+ case 'OBJECT_SCHEMA':
186
+ return 'SCHEMA';
187
+ case 'OBJECT_DATABASE':
188
+ return 'DATABASE';
189
+ case 'OBJECT_DOMAIN':
190
+ return 'DOMAIN';
191
+ case 'OBJECT_AGGREGATE':
192
+ return 'AGGREGATE';
193
+ case 'OBJECT_CONVERSION':
194
+ return 'CONVERSION';
195
+ case 'OBJECT_LANGUAGE':
196
+ return 'LANGUAGE';
197
+ case 'OBJECT_OPERATOR':
198
+ return 'OPERATOR';
199
+ case 'OBJECT_OPFAMILY':
200
+ return 'OPERATOR FAMILY';
201
+ case 'OBJECT_OPCLASS':
202
+ return 'OPERATOR CLASS';
203
+ case 'OBJECT_TSDICTIONARY':
204
+ return 'TEXT SEARCH DICTIONARY';
205
+ case 'OBJECT_TSCONFIGURATION':
206
+ return 'TEXT SEARCH CONFIGURATION';
207
+ case 'OBJECT_EVENT_TRIGGER':
208
+ return 'EVENT TRIGGER';
209
+ case 'OBJECT_FDW':
210
+ return 'FOREIGN DATA WRAPPER';
211
+ case 'OBJECT_FOREIGN_SERVER':
212
+ return 'SERVER';
213
+ case 'OBJECT_TYPE':
214
+ return 'TYPE';
215
+ case 'OBJECT_COLLATION':
216
+ return 'COLLATION';
217
+ case 'OBJECT_PUBLICATION':
218
+ return 'PUBLICATION';
219
+ case 'OBJECT_ACCESS_METHOD':
220
+ return 'ACCESS METHOD';
221
+ case 'OBJECT_AMOP':
222
+ return 'OPERATOR CLASS';
223
+ case 'OBJECT_AMPROC':
224
+ return 'OPERATOR CLASS';
225
+ case 'OBJECT_ATTRIBUTE':
226
+ return 'ATTRIBUTE';
227
+ case 'OBJECT_CAST':
228
+ return 'CAST';
229
+ case 'OBJECT_COLUMN':
230
+ return 'COLUMN';
231
+ case 'OBJECT_DEFAULT':
232
+ return 'DEFAULT';
233
+ case 'OBJECT_DEFACL':
234
+ return 'DEFAULT PRIVILEGES';
235
+ case 'OBJECT_DOMCONSTRAINT':
236
+ return 'DOMAIN';
237
+ case 'OBJECT_EXTENSION':
238
+ return 'EXTENSION';
239
+ case 'OBJECT_FOREIGN_TABLE':
240
+ return 'FOREIGN TABLE';
241
+ case 'OBJECT_LARGEOBJECT':
242
+ return 'LARGE OBJECT';
243
+ case 'OBJECT_MATVIEW':
244
+ return 'MATERIALIZED VIEW';
245
+ case 'OBJECT_PARAMETER_ACL':
246
+ return 'PARAMETER';
247
+ case 'OBJECT_POLICY':
248
+ return 'POLICY';
249
+ case 'OBJECT_PUBLICATION_NAMESPACE':
250
+ return 'PUBLICATION';
251
+ case 'OBJECT_PUBLICATION_REL':
252
+ return 'PUBLICATION';
253
+ case 'OBJECT_ROLE':
254
+ return 'ROLE';
255
+ case 'OBJECT_ROUTINE':
256
+ return 'ROUTINE';
257
+ case 'OBJECT_RULE':
258
+ return 'RULE';
259
+ case 'OBJECT_STATISTIC_EXT':
260
+ return 'STATISTICS';
261
+ case 'OBJECT_SUBSCRIPTION':
262
+ return 'SUBSCRIPTION';
263
+ case 'OBJECT_TABCONSTRAINT':
264
+ return 'CONSTRAINT';
265
+ case 'OBJECT_TABLESPACE':
266
+ return 'TABLESPACE';
267
+ case 'OBJECT_TRANSFORM':
268
+ return 'TRANSFORM';
269
+ case 'OBJECT_TRIGGER':
270
+ return 'TRIGGER';
271
+ case 'OBJECT_TSPARSER':
272
+ return 'TEXT SEARCH PARSER';
273
+ case 'OBJECT_TSTEMPLATE':
274
+ return 'TEXT SEARCH TEMPLATE';
275
+ case 'OBJECT_USER_MAPPING':
276
+ return 'USER MAPPING';
277
+ default:
278
+ throw new Error(`Unsupported objectType: ${objectType}`);
279
+ }
280
+ }
167
281
  deparse(node, context) {
168
282
  if (node == null) {
169
283
  return null;
@@ -2085,10 +2199,13 @@ export class Deparser {
2085
2199
  const isFunctionCall = argType === 'FuncCall';
2086
2200
  if (isSimpleArgument || isFunctionCall) {
2087
2201
  // For simple arguments, avoid :: syntax if they have complex structure
2088
- if (isSimpleArgument && (arg.includes('(') || arg.startsWith('-'))) {
2089
- }
2090
- else {
2202
+ const shouldUseCastSyntax = isSimpleArgument && (arg.includes('(') || arg.startsWith('-'));
2203
+ if (!shouldUseCastSyntax) {
2091
2204
  const cleanTypeName = typeName.replace('pg_catalog.', '');
2205
+ // Wrap FuncCall arguments in parentheses to prevent operator precedence issues
2206
+ if (isFunctionCall) {
2207
+ return `${context.parens(arg)}::${cleanTypeName}`;
2208
+ }
2092
2209
  return `${arg}::${cleanTypeName}`;
2093
2210
  }
2094
2211
  }
@@ -5603,11 +5720,15 @@ export class Deparser {
5603
5720
  if (context.parentNodeTypes.includes('CreateExtensionStmt') || context.parentNodeTypes.includes('AlterExtensionStmt') || context.parentNodeTypes.includes('CreateFdwStmt') || context.parentNodeTypes.includes('AlterFdwStmt')) {
5604
5721
  // AlterExtensionStmt specific cases
5605
5722
  if (context.parentNodeTypes.includes('AlterExtensionStmt')) {
5606
- if (node.defname === 'to') {
5607
- return `TO ${argValue}`;
5723
+ if (node.defname === 'new_version') {
5724
+ // argValue is unquoted due to DefElem context, so we need to quote it
5725
+ const quotedValue = typeof argValue === 'string' && !argValue.startsWith("'")
5726
+ ? `'${argValue}'`
5727
+ : argValue;
5728
+ return `UPDATE TO ${quotedValue}`;
5608
5729
  }
5609
5730
  if (node.defname === 'schema') {
5610
- return `SCHEMA ${argValue}`;
5731
+ return `SET SCHEMA ${argValue}`;
5611
5732
  }
5612
5733
  }
5613
5734
  // CreateFdwStmt specific cases
@@ -5871,6 +5992,34 @@ export class Deparser {
5871
5992
  }
5872
5993
  return output.join(' ');
5873
5994
  }
5995
+ AlterExtensionContentsStmt(node, context) {
5996
+ const output = ['ALTER', 'EXTENSION'];
5997
+ if (node.extname) {
5998
+ output.push(this.quoteIfNeeded(node.extname));
5999
+ }
6000
+ // Handle action: 1 = ADD, -1 = DROP
6001
+ if (node.action === 1) {
6002
+ output.push('ADD');
6003
+ }
6004
+ else if (node.action === -1) {
6005
+ output.push('DROP');
6006
+ }
6007
+ // Add object type keyword
6008
+ if (node.objtype) {
6009
+ try {
6010
+ output.push(this.getObjectTypeKeyword(node.objtype));
6011
+ }
6012
+ catch {
6013
+ // Fallback to the raw objtype if not supported
6014
+ output.push(node.objtype.toString());
6015
+ }
6016
+ }
6017
+ // Add the object itself
6018
+ if (node.object) {
6019
+ output.push(this.visit(node.object, context));
6020
+ }
6021
+ return output.join(' ');
6022
+ }
5874
6023
  CreateFdwStmt(node, context) {
5875
6024
  const output = ['CREATE', 'FOREIGN', 'DATA', 'WRAPPER'];
5876
6025
  if (node.fdwname) {
@@ -7577,76 +7726,7 @@ export class Deparser {
7577
7726
  if (!node.objectType) {
7578
7727
  throw new Error('AlterOwnerStmt requires objectType');
7579
7728
  }
7580
- switch (node.objectType) {
7581
- case 'OBJECT_TABLE':
7582
- output.push('TABLE');
7583
- break;
7584
- case 'OBJECT_VIEW':
7585
- output.push('VIEW');
7586
- break;
7587
- case 'OBJECT_INDEX':
7588
- output.push('INDEX');
7589
- break;
7590
- case 'OBJECT_SEQUENCE':
7591
- output.push('SEQUENCE');
7592
- break;
7593
- case 'OBJECT_FUNCTION':
7594
- output.push('FUNCTION');
7595
- break;
7596
- case 'OBJECT_PROCEDURE':
7597
- output.push('PROCEDURE');
7598
- break;
7599
- case 'OBJECT_SCHEMA':
7600
- output.push('SCHEMA');
7601
- break;
7602
- case 'OBJECT_DATABASE':
7603
- output.push('DATABASE');
7604
- break;
7605
- case 'OBJECT_DOMAIN':
7606
- output.push('DOMAIN');
7607
- break;
7608
- case 'OBJECT_AGGREGATE':
7609
- output.push('AGGREGATE');
7610
- break;
7611
- case 'OBJECT_CONVERSION':
7612
- output.push('CONVERSION');
7613
- break;
7614
- case 'OBJECT_LANGUAGE':
7615
- output.push('LANGUAGE');
7616
- break;
7617
- case 'OBJECT_OPERATOR':
7618
- output.push('OPERATOR');
7619
- break;
7620
- case 'OBJECT_OPFAMILY':
7621
- output.push('OPERATOR FAMILY');
7622
- break;
7623
- case 'OBJECT_OPCLASS':
7624
- output.push('OPERATOR CLASS');
7625
- break;
7626
- case 'OBJECT_TSDICTIONARY':
7627
- output.push('TEXT SEARCH DICTIONARY');
7628
- break;
7629
- case 'OBJECT_TSCONFIGURATION':
7630
- output.push('TEXT SEARCH CONFIGURATION');
7631
- break;
7632
- case 'OBJECT_EVENT_TRIGGER':
7633
- output.push('EVENT TRIGGER');
7634
- break;
7635
- case 'OBJECT_FDW':
7636
- output.push('FOREIGN DATA WRAPPER');
7637
- break;
7638
- case 'OBJECT_FOREIGN_SERVER':
7639
- output.push('SERVER');
7640
- break;
7641
- case 'OBJECT_TYPE':
7642
- output.push('TYPE');
7643
- break;
7644
- case 'OBJECT_COLLATION':
7645
- output.push('COLLATION');
7646
- break;
7647
- default:
7648
- throw new Error(`Unsupported AlterOwnerStmt objectType: ${node.objectType}`);
7649
- }
7729
+ output.push(this.getObjectTypeKeyword(node.objectType));
7650
7730
  if (node.relation) {
7651
7731
  output.push(this.RangeVar(node.relation, context));
7652
7732
  }
@@ -10164,66 +10244,12 @@ export class Deparser {
10164
10244
  }
10165
10245
  AlterObjectSchemaStmt(node, context) {
10166
10246
  const output = ['ALTER'];
10167
- switch (node.objectType) {
10168
- case 'OBJECT_TABLE':
10169
- output.push('TABLE');
10170
- break;
10171
- case 'OBJECT_VIEW':
10172
- output.push('VIEW');
10173
- break;
10174
- case 'OBJECT_FUNCTION':
10175
- output.push('FUNCTION');
10176
- break;
10177
- case 'OBJECT_TYPE':
10178
- output.push('TYPE');
10179
- break;
10180
- case 'OBJECT_DOMAIN':
10181
- output.push('DOMAIN');
10182
- break;
10183
- case 'OBJECT_SEQUENCE':
10184
- output.push('SEQUENCE');
10185
- break;
10186
- case 'OBJECT_OPCLASS':
10187
- output.push('OPERATOR CLASS');
10188
- break;
10189
- case 'OBJECT_OPFAMILY':
10190
- output.push('OPERATOR FAMILY');
10191
- break;
10192
- case 'OBJECT_OPERATOR':
10193
- output.push('OPERATOR');
10194
- break;
10195
- case 'OBJECT_TYPE':
10196
- output.push('TYPE');
10197
- break;
10198
- case 'OBJECT_COLLATION':
10199
- output.push('COLLATION');
10200
- break;
10201
- case 'OBJECT_CONVERSION':
10202
- output.push('CONVERSION');
10203
- break;
10204
- case 'OBJECT_TSPARSER':
10205
- output.push('TEXT SEARCH PARSER');
10206
- break;
10207
- case 'OBJECT_TSCONFIGURATION':
10208
- output.push('TEXT SEARCH CONFIGURATION');
10209
- break;
10210
- case 'OBJECT_TSTEMPLATE':
10211
- output.push('TEXT SEARCH TEMPLATE');
10212
- break;
10213
- case 'OBJECT_TSDICTIONARY':
10214
- output.push('TEXT SEARCH DICTIONARY');
10215
- break;
10216
- case 'OBJECT_AGGREGATE':
10217
- output.push('AGGREGATE');
10218
- break;
10219
- case 'OBJECT_FOREIGN_TABLE':
10220
- output.push('FOREIGN TABLE');
10221
- break;
10222
- case 'OBJECT_MATVIEW':
10223
- output.push('MATERIALIZED VIEW');
10224
- break;
10225
- default:
10226
- output.push(node.objectType.toString());
10247
+ try {
10248
+ output.push(this.getObjectTypeKeyword(node.objectType));
10249
+ }
10250
+ catch {
10251
+ // Fallback to objectType string if not supported
10252
+ output.push(node.objectType.toString());
10227
10253
  }
10228
10254
  if (node.missing_ok) {
10229
10255
  output.push('IF EXISTS');
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "pgsql-deparser",
3
- "version": "17.10.0",
3
+ "version": "17.12.0",
4
4
  "author": "Dan Lynch <pyramation@gmail.com>",
5
5
  "description": "PostgreSQL AST Deparser",
6
6
  "main": "index.js",
7
7
  "module": "esm/index.js",
8
8
  "types": "index.d.ts",
9
9
  "homepage": "https://github.com/launchql/pgsql-parser",
10
- "license": "SEE LICENSE IN LICENSE",
10
+ "license": "MIT",
11
11
  "publishConfig": {
12
12
  "access": "public",
13
13
  "directory": "dist"
@@ -53,10 +53,10 @@
53
53
  "database"
54
54
  ],
55
55
  "devDependencies": {
56
- "libpg-query": "17.5.5"
56
+ "libpg-query": "17.6.0"
57
57
  },
58
58
  "dependencies": {
59
59
  "@pgsql/types": "^17.6.1"
60
60
  },
61
- "gitHead": "ccaa3c5ef9104de83e8c2624706520e4a2be5e88"
61
+ "gitHead": "3ae060bb9e0edcf8869d6e9da350216d6c6e01cf"
62
62
  }