pgsql-deparser 17.11.1 → 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 +6 -0
- package/deparser.js +162 -136
- package/esm/deparser.js +162 -136
- package/package.json +3 -3
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
|
-
|
|
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 === '
|
|
5610
|
-
|
|
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
|
-
|
|
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
|
-
|
|
10171
|
-
|
|
10172
|
-
|
|
10173
|
-
|
|
10174
|
-
|
|
10175
|
-
|
|
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
|
-
|
|
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 === '
|
|
5607
|
-
|
|
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
|
-
|
|
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
|
-
|
|
10168
|
-
|
|
10169
|
-
|
|
10170
|
-
|
|
10171
|
-
|
|
10172
|
-
|
|
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.
|
|
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": "
|
|
10
|
+
"license": "MIT",
|
|
11
11
|
"publishConfig": {
|
|
12
12
|
"access": "public",
|
|
13
13
|
"directory": "dist"
|
|
@@ -58,5 +58,5 @@
|
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@pgsql/types": "^17.6.1"
|
|
60
60
|
},
|
|
61
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "3ae060bb9e0edcf8869d6e9da350216d6c6e01cf"
|
|
62
62
|
}
|