pgsql-deparser 14.1.1 → 14.2.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/README.md +12 -7
- package/deparser/deparser.d.ts +31 -28
- package/deparser/deparser.js +1253 -814
- package/deparser/index.d.ts +3 -1
- package/deparser/index.js +5 -1
- package/deparser/utils/sql-formatter.d.ts +8 -0
- package/deparser/utils/sql-formatter.js +104 -1
- package/esm/deparser/deparser.js +1236 -797
- package/esm/deparser/index.js +3 -1
- package/esm/deparser/utils/sql-formatter.js +103 -1
- package/esm/index.js +80 -7
- package/esm/v14-to-v15.js +34 -0
- package/esm/v14-to-v18-direct.js +77 -0
- package/esm/v15-to-v16.js +16 -5
- package/esm/v16-to-v17.js +50 -1
- package/esm/v17-to-v18.js +209 -0
- package/index.d.ts +17 -4
- package/index.js +83 -6
- package/package.json +3 -2
- package/v14-to-v15.d.ts +1 -0
- package/v14-to-v15.js +34 -0
- package/v14-to-v18-direct.d.ts +24 -0
- package/v14-to-v18-direct.js +81 -0
- package/v15-to-v16.js +16 -5
- package/v16-to-v17.d.ts +3 -0
- package/v16-to-v17.js +50 -1
- package/v17-to-v18.d.ts +55 -0
- package/v17-to-v18.js +213 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generated file with types stripped for better tree-shaking
|
|
3
|
+
* DO NOT EDIT - Generated by strip-transformer-types.ts
|
|
4
|
+
*/
|
|
5
|
+
// @ts-nocheck
|
|
6
|
+
/**
|
|
7
|
+
* V17 to V18 AST Transformer
|
|
8
|
+
* Transforms PostgreSQL v17 AST nodes to v18 format
|
|
9
|
+
*
|
|
10
|
+
* Structural changes in v18:
|
|
11
|
+
* - InsertStmt/UpdateStmt/DeleteStmt/MergeStmt: returningList -> returningClause { exprs }
|
|
12
|
+
* - Constraint: new is_enforced flag (true by default for CHECK/FOREIGN/NOTNULL)
|
|
13
|
+
* - Constraint: CONSTR_GENERATED gains generated_kind ('s' = STORED, 'v' = VIRTUAL)
|
|
14
|
+
* - Column-level NOT NULL constraints gain initially_valid: true
|
|
15
|
+
*/
|
|
16
|
+
export class V17ToV18Transformer {
|
|
17
|
+
transform(node, context = { parentNodeTypes: [] }) {
|
|
18
|
+
if (node == null) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
if (typeof node === 'number' || node instanceof Number) {
|
|
22
|
+
return node;
|
|
23
|
+
}
|
|
24
|
+
if (typeof node === 'string') {
|
|
25
|
+
return node;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
return this.visit(node, context);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const nodeType = Object.keys(node)[0];
|
|
32
|
+
throw new Error(`Error transforming ${nodeType}: ${error.message}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
visit(node, context = { parentNodeTypes: [] }) {
|
|
36
|
+
if (node && typeof node === 'object' && 'version' in node && 'stmts' in node) {
|
|
37
|
+
return this.ParseResult(node, context);
|
|
38
|
+
}
|
|
39
|
+
const nodeType = this.getNodeType(node);
|
|
40
|
+
// Handle empty objects
|
|
41
|
+
if (!nodeType) {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
const nodeData = this.getNodeData(node);
|
|
45
|
+
const methodName = nodeType;
|
|
46
|
+
if (typeof this[methodName] === 'function') {
|
|
47
|
+
const childContext = {
|
|
48
|
+
...context,
|
|
49
|
+
parentNodeTypes: [...context.parentNodeTypes, nodeType]
|
|
50
|
+
};
|
|
51
|
+
const result = this[methodName](nodeData, childContext);
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
// No specific method: recurse into children so nested statements
|
|
55
|
+
// (e.g. DML inside CTEs) still get transformed
|
|
56
|
+
return this.walkValue(node, context);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generic recursive walk that re-dispatches wrapped nodes with a
|
|
60
|
+
* dedicated transformer method and deep-copies everything else.
|
|
61
|
+
*/
|
|
62
|
+
walkValue(value, context) {
|
|
63
|
+
if (value == null || typeof value !== 'object') {
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
if (Array.isArray(value)) {
|
|
67
|
+
return value.map(item => this.walkValue(item, context));
|
|
68
|
+
}
|
|
69
|
+
const keys = Object.keys(value);
|
|
70
|
+
if (keys.length === 1 && typeof this[keys[0]] === 'function') {
|
|
71
|
+
// Wrapped node with a dedicated transformer method
|
|
72
|
+
return this.visit(value, context);
|
|
73
|
+
}
|
|
74
|
+
const result = {};
|
|
75
|
+
for (const key of keys) {
|
|
76
|
+
result[key] = this.walkValue(value[key], context);
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
getNodeType(node) {
|
|
81
|
+
return Object.keys(node)[0];
|
|
82
|
+
}
|
|
83
|
+
getNodeData(node) {
|
|
84
|
+
const keys = Object.keys(node);
|
|
85
|
+
if (keys.length === 1 && typeof node[keys[0]] === 'object') {
|
|
86
|
+
return node[keys[0]];
|
|
87
|
+
}
|
|
88
|
+
return node;
|
|
89
|
+
}
|
|
90
|
+
ParseResult(node, context) {
|
|
91
|
+
if (node && typeof node === 'object' && 'version' in node && 'stmts' in node) {
|
|
92
|
+
return {
|
|
93
|
+
version: 180004, // PG18 version
|
|
94
|
+
stmts: node.stmts.map((stmt) => {
|
|
95
|
+
if (stmt && typeof stmt === 'object' && 'stmt' in stmt) {
|
|
96
|
+
return {
|
|
97
|
+
...stmt,
|
|
98
|
+
stmt: this.transform(stmt.stmt, context)
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return this.transform(stmt, context);
|
|
102
|
+
})
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return node;
|
|
106
|
+
}
|
|
107
|
+
RawStmt(node, context) {
|
|
108
|
+
const result = {};
|
|
109
|
+
if (node.stmt !== undefined) {
|
|
110
|
+
result.stmt = this.transform(node.stmt, context);
|
|
111
|
+
}
|
|
112
|
+
if (node.stmt_location !== undefined) {
|
|
113
|
+
result.stmt_location = node.stmt_location;
|
|
114
|
+
}
|
|
115
|
+
if (node.stmt_len !== undefined) {
|
|
116
|
+
result.stmt_len = node.stmt_len;
|
|
117
|
+
}
|
|
118
|
+
return { RawStmt: result };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Convert a v17 returningList into a v18 ReturningClause
|
|
122
|
+
*/
|
|
123
|
+
transformReturningList(returningList, context) {
|
|
124
|
+
return {
|
|
125
|
+
exprs: returningList.map(item => this.transform(item, context))
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
transformDmlStatement(nodeType, node, context) {
|
|
129
|
+
const result = {};
|
|
130
|
+
for (const key of Object.keys(node)) {
|
|
131
|
+
if (key === 'returningList') {
|
|
132
|
+
result.returningClause = this.transformReturningList(node.returningList, context);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
result[key] = this.walkValue(node[key], context);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return { [nodeType]: result };
|
|
139
|
+
}
|
|
140
|
+
InsertStmt(node, context) {
|
|
141
|
+
return this.transformDmlStatement('InsertStmt', node, context);
|
|
142
|
+
}
|
|
143
|
+
UpdateStmt(node, context) {
|
|
144
|
+
return this.transformDmlStatement('UpdateStmt', node, context);
|
|
145
|
+
}
|
|
146
|
+
DeleteStmt(node, context) {
|
|
147
|
+
return this.transformDmlStatement('DeleteStmt', node, context);
|
|
148
|
+
}
|
|
149
|
+
MergeStmt(node, context) {
|
|
150
|
+
return this.transformDmlStatement('MergeStmt', node, context);
|
|
151
|
+
}
|
|
152
|
+
AlterTableCmd(node, context) {
|
|
153
|
+
const result = {};
|
|
154
|
+
for (const key of Object.keys(node)) {
|
|
155
|
+
result[key] = this.walkValue(node[key], context);
|
|
156
|
+
}
|
|
157
|
+
// v18 wraps ALTER CONSTRAINT definitions in the new ATAlterConstraint node
|
|
158
|
+
if (node.subtype === 'AT_AlterConstraint' && node.def?.Constraint) {
|
|
159
|
+
const constraint = node.def.Constraint;
|
|
160
|
+
const alterConstraint = {};
|
|
161
|
+
if (constraint.conname !== undefined) {
|
|
162
|
+
alterConstraint.conname = constraint.conname;
|
|
163
|
+
}
|
|
164
|
+
alterConstraint.is_enforced = true;
|
|
165
|
+
// v17 ALTER CONSTRAINT could only change deferrability
|
|
166
|
+
alterConstraint.alterDeferrability = true;
|
|
167
|
+
if (constraint.deferrable !== undefined) {
|
|
168
|
+
alterConstraint.deferrable = constraint.deferrable;
|
|
169
|
+
}
|
|
170
|
+
if (constraint.initdeferred !== undefined) {
|
|
171
|
+
alterConstraint.initdeferred = constraint.initdeferred;
|
|
172
|
+
}
|
|
173
|
+
result.def = { ATAlterConstraint: alterConstraint };
|
|
174
|
+
}
|
|
175
|
+
return { AlterTableCmd: result };
|
|
176
|
+
}
|
|
177
|
+
VariableSetStmt(node, context) {
|
|
178
|
+
const result = {};
|
|
179
|
+
for (const key of Object.keys(node)) {
|
|
180
|
+
result[key] = this.walkValue(node[key], context);
|
|
181
|
+
}
|
|
182
|
+
// v18 marks SET TRANSACTION / SESSION CHARACTERISTICS args as jumbled
|
|
183
|
+
if (node.kind === 'VAR_SET_MULTI' && (node.name === 'TRANSACTION' || node.name === 'SESSION CHARACTERISTICS')) {
|
|
184
|
+
result.jumble_args = true;
|
|
185
|
+
}
|
|
186
|
+
return { VariableSetStmt: result };
|
|
187
|
+
}
|
|
188
|
+
Constraint(node, context) {
|
|
189
|
+
const result = {};
|
|
190
|
+
for (const key of Object.keys(node)) {
|
|
191
|
+
result[key] = this.walkValue(node[key], context);
|
|
192
|
+
}
|
|
193
|
+
// v18 constraints are enforced by default; v17 grammar had no ENFORCED syntax
|
|
194
|
+
if (node.contype === 'CONSTR_CHECK' || node.contype === 'CONSTR_FOREIGN') {
|
|
195
|
+
result.is_enforced = true;
|
|
196
|
+
}
|
|
197
|
+
if (node.contype === 'CONSTR_NOTNULL') {
|
|
198
|
+
// v17 only produces column-level NOT NULL constraints, which in v18
|
|
199
|
+
// carry is_enforced and initially_valid
|
|
200
|
+
result.is_enforced = true;
|
|
201
|
+
result.initially_valid = true;
|
|
202
|
+
}
|
|
203
|
+
if (node.contype === 'CONSTR_GENERATED' && result.generated_kind === undefined) {
|
|
204
|
+
// v17 only supports STORED generated columns
|
|
205
|
+
result.generated_kind = 's';
|
|
206
|
+
}
|
|
207
|
+
return { Constraint: result };
|
|
208
|
+
}
|
|
209
|
+
}
|
package/index.d.ts
CHANGED
|
@@ -3,7 +3,20 @@
|
|
|
3
3
|
* Auto-generated by generate-version-deparsers.ts
|
|
4
4
|
*/
|
|
5
5
|
import { Node, ParseResult } from '@pgsql/types';
|
|
6
|
-
import { DeparserOptions } from './deparser';
|
|
7
|
-
|
|
8
|
-
export declare
|
|
9
|
-
|
|
6
|
+
import { Deparser as Deparser18, DeparserOptions } from './deparser';
|
|
7
|
+
type Query = Node | Node[] | ParseResult;
|
|
8
|
+
export declare class Deparser extends Deparser18 {
|
|
9
|
+
constructor(tree: Query, opts?: DeparserOptions);
|
|
10
|
+
static deparse(query: Query, opts?: DeparserOptions): string;
|
|
11
|
+
DefElem(node: any, context: any): string;
|
|
12
|
+
GrantRoleStmt(node: any, context: any): string;
|
|
13
|
+
private publicationTableListed;
|
|
14
|
+
CreatePublicationStmt(node: any, context: any): string;
|
|
15
|
+
AlterPublicationStmt(node: any, context: any): string;
|
|
16
|
+
PublicationObjSpec(node: any, context: any): string;
|
|
17
|
+
}
|
|
18
|
+
export declare function deparse(query: Query, opts?: DeparserOptions): Promise<string>;
|
|
19
|
+
export declare function deparseSync(query: Query, opts?: DeparserOptions): string;
|
|
20
|
+
export { DeparserOptions };
|
|
21
|
+
export { splitSqlLines } from './deparser/utils/sql-formatter';
|
|
22
|
+
export { QuoteUtils } from '@pgsql/quotes';
|
package/index.js
CHANGED
|
@@ -4,16 +4,93 @@
|
|
|
4
4
|
* Auto-generated by generate-version-deparsers.ts
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.QuoteUtils = exports.splitSqlLines = exports.Deparser = void 0;
|
|
7
8
|
exports.deparse = deparse;
|
|
8
9
|
exports.deparseSync = deparseSync;
|
|
9
10
|
const deparser_1 = require("./deparser");
|
|
10
|
-
const
|
|
11
|
-
const tx = new
|
|
11
|
+
const v14_to_v18_direct_1 = require("./v14-to-v18-direct");
|
|
12
|
+
const tx = new v14_to_v18_direct_1.PG14ToPG18Transformer();
|
|
13
|
+
const bare = (names, name) => Array.isArray(names) && names.length === 1 && (names[0]?.String?.sval ?? names[0]?.String?.str) === name;
|
|
14
|
+
const v16to17 = tx.v16to17;
|
|
15
|
+
const upgradeTypeName = v16to17.TypeName.bind(v16to17);
|
|
16
|
+
v16to17.TypeName = (node, context) => {
|
|
17
|
+
const out = upgradeTypeName(node, context);
|
|
18
|
+
if (bare(node.names, 'json'))
|
|
19
|
+
out.TypeName.names = [{ String: { sval: 'json' } }];
|
|
20
|
+
return out;
|
|
21
|
+
};
|
|
22
|
+
const upgradeTypeCast = v16to17.TypeCast.bind(v16to17);
|
|
23
|
+
v16to17.TypeCast = (node, context) => {
|
|
24
|
+
const out = upgradeTypeCast(node, context);
|
|
25
|
+
const typeName = out.TypeCast.typeName?.TypeName ?? out.TypeCast.typeName;
|
|
26
|
+
if (typeName && bare((node.typeName?.TypeName ?? node.typeName)?.names, 'json')) {
|
|
27
|
+
typeName.names = [{ String: { sval: 'json' } }];
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
};
|
|
31
|
+
const v15to16 = tx.v15to16;
|
|
32
|
+
const upgradeFuncCall = v15to16.FuncCall.bind(v15to16);
|
|
33
|
+
v15to16.FuncCall = (node, context) => {
|
|
34
|
+
const out = upgradeFuncCall(node, context);
|
|
35
|
+
if (out.FuncCall && bare(node.funcname, 'json_object')) {
|
|
36
|
+
out.FuncCall.funcname = [{ String: { sval: 'json_object' } }];
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
};
|
|
40
|
+
const toAst18 = (query) => Array.isArray(query) ? query.map(node => tx.transform(node)) : tx.transform(query);
|
|
41
|
+
class Deparser extends deparser_1.Deparser {
|
|
42
|
+
constructor(tree, opts = {}) {
|
|
43
|
+
super(toAst18(tree), opts);
|
|
44
|
+
}
|
|
45
|
+
static deparse(query, opts = {}) {
|
|
46
|
+
return new Deparser(query, opts).deparseQuery();
|
|
47
|
+
}
|
|
48
|
+
DefElem(node, context) {
|
|
49
|
+
if (!node.arg && node.defaction !== 'DEFELEM_DROP' && context.parentNodeTypes.includes('AlterOperatorStmt')) {
|
|
50
|
+
return `${node.defname} = NONE`;
|
|
51
|
+
}
|
|
52
|
+
return super.DefElem(node, context);
|
|
53
|
+
}
|
|
54
|
+
GrantRoleStmt(node, context) {
|
|
55
|
+
const sql = super.GrantRoleStmt(node, context);
|
|
56
|
+
const opts = (Array.isArray(node.opt) ? node.opt : []).map((opt) => opt.DefElem);
|
|
57
|
+
const arg = opts[0]?.arg;
|
|
58
|
+
const off = arg?.Boolean ? arg.Boolean.boolval !== true : arg?.String?.sval === 'false';
|
|
59
|
+
if (!node.is_grant || opts.length !== 1 || opts[0]?.defname !== 'admin' || off)
|
|
60
|
+
return sql;
|
|
61
|
+
// locate the option by what the statement prints without GRANTED BY, so a role name can never match
|
|
62
|
+
const head = node.grantor ? super.GrantRoleStmt({ ...node, grantor: undefined }, context) : sql;
|
|
63
|
+
const option = ' WITH ADMIN TRUE';
|
|
64
|
+
if (!head.endsWith(option) || !sql.startsWith(head))
|
|
65
|
+
return sql;
|
|
66
|
+
return head.slice(0, -option.length) + ' WITH ADMIN OPTION' + sql.slice(head.length);
|
|
67
|
+
}
|
|
68
|
+
publicationTableListed = false;
|
|
69
|
+
CreatePublicationStmt(node, context) {
|
|
70
|
+
this.publicationTableListed = false;
|
|
71
|
+
return super.CreatePublicationStmt(node, context);
|
|
72
|
+
}
|
|
73
|
+
AlterPublicationStmt(node, context) {
|
|
74
|
+
this.publicationTableListed = false;
|
|
75
|
+
return super.AlterPublicationStmt(node, context);
|
|
76
|
+
}
|
|
77
|
+
PublicationObjSpec(node, context) {
|
|
78
|
+
const sql = super.PublicationObjSpec(node, context);
|
|
79
|
+
if (node.pubobjtype !== 'PUBLICATIONOBJ_TABLE')
|
|
80
|
+
return sql;
|
|
81
|
+
const first = !this.publicationTableListed;
|
|
82
|
+
this.publicationTableListed = true;
|
|
83
|
+
return first ? sql : sql.replace(/^TABLE /, '');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.Deparser = Deparser;
|
|
12
87
|
async function deparse(query, opts) {
|
|
13
|
-
|
|
14
|
-
return await (0, deparser_1.deparse)(ast17, opts);
|
|
88
|
+
return Deparser.deparse(query, opts);
|
|
15
89
|
}
|
|
16
90
|
function deparseSync(query, opts) {
|
|
17
|
-
|
|
18
|
-
return (0, deparser_1.deparseSync)(ast17, opts);
|
|
91
|
+
return Deparser.deparse(query, opts);
|
|
19
92
|
}
|
|
93
|
+
var sql_formatter_1 = require("./deparser/utils/sql-formatter");
|
|
94
|
+
Object.defineProperty(exports, "splitSqlLines", { enumerable: true, get: function () { return sql_formatter_1.splitSqlLines; } });
|
|
95
|
+
var quotes_1 = require("@pgsql/quotes");
|
|
96
|
+
Object.defineProperty(exports, "QuoteUtils", { enumerable: true, get: function () { return quotes_1.QuoteUtils; } });
|
package/package.json
CHANGED
package/v14-to-v15.d.ts
CHANGED
package/v14-to-v15.js
CHANGED
|
@@ -831,8 +831,21 @@ class V14ToV15Transformer {
|
|
|
831
831
|
const result = this.transformGenericNode(node, context);
|
|
832
832
|
return { StatsElem: result };
|
|
833
833
|
}
|
|
834
|
+
// PG15 replaced the publication's list of tables with a list of PublicationObjSpec
|
|
835
|
+
publicationTablesToObjects(result) {
|
|
836
|
+
if (result.tables === undefined)
|
|
837
|
+
return;
|
|
838
|
+
result.pubobjects = (Array.isArray(result.tables) ? result.tables : [result.tables]).map((table) => ({
|
|
839
|
+
PublicationObjSpec: {
|
|
840
|
+
pubobjtype: 'PUBLICATIONOBJ_TABLE',
|
|
841
|
+
pubtable: { relation: table.RangeVar ?? table }
|
|
842
|
+
}
|
|
843
|
+
}));
|
|
844
|
+
delete result.tables;
|
|
845
|
+
}
|
|
834
846
|
CreatePublicationStmt(node, context) {
|
|
835
847
|
const result = this.transformGenericNode(node, context);
|
|
848
|
+
this.publicationTablesToObjects(result);
|
|
836
849
|
return { CreatePublicationStmt: result };
|
|
837
850
|
}
|
|
838
851
|
CreateSubscriptionStmt(node, context) {
|
|
@@ -841,10 +854,31 @@ class V14ToV15Transformer {
|
|
|
841
854
|
}
|
|
842
855
|
AlterPublicationStmt(node, context) {
|
|
843
856
|
const result = this.transformGenericNode(node, context);
|
|
857
|
+
this.publicationTablesToObjects(result);
|
|
858
|
+
if (result.tableAction !== undefined) {
|
|
859
|
+
const actions = {
|
|
860
|
+
DEFELEM_ADD: 'AP_AddObjects',
|
|
861
|
+
DEFELEM_DROP: 'AP_DropObjects',
|
|
862
|
+
DEFELEM_SET: 'AP_SetObjects'
|
|
863
|
+
};
|
|
864
|
+
if (actions[result.tableAction]) {
|
|
865
|
+
result.action = actions[result.tableAction];
|
|
866
|
+
}
|
|
867
|
+
delete result.tableAction;
|
|
868
|
+
}
|
|
844
869
|
return { AlterPublicationStmt: result };
|
|
845
870
|
}
|
|
846
871
|
AlterSubscriptionStmt(node, context) {
|
|
847
872
|
const result = this.transformGenericNode(node, context);
|
|
873
|
+
// ENABLE / DISABLE carried an Integer before PG15 introduced the Boolean node
|
|
874
|
+
if (result.kind === 'ALTER_SUBSCRIPTION_ENABLED' && Array.isArray(result.options)) {
|
|
875
|
+
result.options = result.options.map((option) => {
|
|
876
|
+
const ival = option?.DefElem?.arg?.Integer;
|
|
877
|
+
if (option?.DefElem?.defname !== 'enabled' || !ival)
|
|
878
|
+
return option;
|
|
879
|
+
return { DefElem: { ...option.DefElem, arg: { Boolean: { boolval: ival.ival === 1 } } } };
|
|
880
|
+
});
|
|
881
|
+
}
|
|
848
882
|
return { AlterSubscriptionStmt: result };
|
|
849
883
|
}
|
|
850
884
|
DropSubscriptionStmt(node, context) {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generated file with types stripped for better tree-shaking
|
|
3
|
+
* DO NOT EDIT - Generated by strip-direct-transformer-types.ts
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Direct transformer from PG14 to PG18
|
|
7
|
+
* This transformer chains v14->...->v18 transformations
|
|
8
|
+
*/
|
|
9
|
+
export declare class PG14ToPG18Transformer {
|
|
10
|
+
private v14to15;
|
|
11
|
+
private v15to16;
|
|
12
|
+
private v16to17;
|
|
13
|
+
private v17to18;
|
|
14
|
+
transform(node: any): any;
|
|
15
|
+
/**
|
|
16
|
+
* Transform a single statement from PG14 to PG18
|
|
17
|
+
* @deprecated Use transform() instead, which handles all node types
|
|
18
|
+
*/
|
|
19
|
+
transformStatement(stmt: any): any;
|
|
20
|
+
/**
|
|
21
|
+
* Type guard to check if a node is a ParseResult
|
|
22
|
+
*/
|
|
23
|
+
private isParseResult;
|
|
24
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auto-generated file with types stripped for better tree-shaking
|
|
4
|
+
* DO NOT EDIT - Generated by strip-direct-transformer-types.ts
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PG14ToPG18Transformer = void 0;
|
|
8
|
+
const v14_to_v15_1 = require("./v14-to-v15");
|
|
9
|
+
const v15_to_v16_1 = require("./v15-to-v16");
|
|
10
|
+
const v16_to_v17_1 = require("./v16-to-v17");
|
|
11
|
+
const v17_to_v18_1 = require("./v17-to-v18");
|
|
12
|
+
/**
|
|
13
|
+
* Direct transformer from PG14 to PG18
|
|
14
|
+
* This transformer chains v14->...->v18 transformations
|
|
15
|
+
*/
|
|
16
|
+
class PG14ToPG18Transformer {
|
|
17
|
+
v14to15 = new v14_to_v15_1.V14ToV15Transformer();
|
|
18
|
+
v15to16 = new v15_to_v16_1.V15ToV16Transformer();
|
|
19
|
+
v16to17 = new v16_to_v17_1.V16ToV17Transformer();
|
|
20
|
+
v17to18 = new v17_to_v18_1.V17ToV18Transformer();
|
|
21
|
+
transform(node) {
|
|
22
|
+
if (this.isParseResult(node)) {
|
|
23
|
+
// Transform through the chain: v14->v15->v16->v17->v18
|
|
24
|
+
const v15Stmts = node.stmts.map((stmtWrapper) => {
|
|
25
|
+
if (stmtWrapper.stmt) {
|
|
26
|
+
const stmt = this.v14to15.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
27
|
+
return { ...stmtWrapper, stmt };
|
|
28
|
+
}
|
|
29
|
+
return stmtWrapper;
|
|
30
|
+
});
|
|
31
|
+
const v16Stmts = v15Stmts.map((stmtWrapper) => {
|
|
32
|
+
if (stmtWrapper.stmt) {
|
|
33
|
+
const stmt = this.v15to16.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
34
|
+
return { ...stmtWrapper, stmt };
|
|
35
|
+
}
|
|
36
|
+
return stmtWrapper;
|
|
37
|
+
});
|
|
38
|
+
const v17Stmts = v16Stmts.map((stmtWrapper) => {
|
|
39
|
+
if (stmtWrapper.stmt) {
|
|
40
|
+
const stmt = this.v16to17.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
41
|
+
return { ...stmtWrapper, stmt };
|
|
42
|
+
}
|
|
43
|
+
return stmtWrapper;
|
|
44
|
+
});
|
|
45
|
+
const v18Stmts = v17Stmts.map((stmtWrapper) => {
|
|
46
|
+
if (stmtWrapper.stmt) {
|
|
47
|
+
const stmt = this.v17to18.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
48
|
+
return { ...stmtWrapper, stmt };
|
|
49
|
+
}
|
|
50
|
+
return stmtWrapper;
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
...node,
|
|
54
|
+
version: 180004, // PG18 version
|
|
55
|
+
stmts: v18Stmts
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Otherwise, transform as a regular node through the chain
|
|
59
|
+
const v15Node = this.v14to15.transform(node, { parentNodeTypes: [] });
|
|
60
|
+
const v16Node = this.v15to16.transform(v15Node, { parentNodeTypes: [] });
|
|
61
|
+
const v17Node = this.v16to17.transform(v16Node, { parentNodeTypes: [] });
|
|
62
|
+
return this.v17to18.transform(v17Node, { parentNodeTypes: [] });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Transform a single statement from PG14 to PG18
|
|
66
|
+
* @deprecated Use transform() instead, which handles all node types
|
|
67
|
+
*/
|
|
68
|
+
transformStatement(stmt) {
|
|
69
|
+
const v15Stmt = this.v14to15.transform(stmt, { parentNodeTypes: [] });
|
|
70
|
+
const v16Stmt = this.v15to16.transform(v15Stmt, { parentNodeTypes: [] });
|
|
71
|
+
const v17Stmt = this.v16to17.transform(v16Stmt, { parentNodeTypes: [] });
|
|
72
|
+
return this.v17to18.transform(v17Stmt, { parentNodeTypes: [] });
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Type guard to check if a node is a ParseResult
|
|
76
|
+
*/
|
|
77
|
+
isParseResult(node) {
|
|
78
|
+
return node && typeof node === 'object' && 'version' in node && 'stmts' in node;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.PG14ToPG18Transformer = PG14ToPG18Transformer;
|
package/v15-to-v16.js
CHANGED
|
@@ -793,9 +793,9 @@ class V15ToV16Transformer {
|
|
|
793
793
|
const partspec = { ...node.partspec };
|
|
794
794
|
if (partspec.strategy !== undefined) {
|
|
795
795
|
const strategyMap = {
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
796
|
+
range: 'PARTITION_STRATEGY_RANGE',
|
|
797
|
+
list: 'PARTITION_STRATEGY_LIST',
|
|
798
|
+
hash: 'PARTITION_STRATEGY_HASH'
|
|
799
799
|
};
|
|
800
800
|
partspec.strategy = strategyMap[partspec.strategy] || partspec.strategy;
|
|
801
801
|
}
|
|
@@ -857,6 +857,9 @@ class V15ToV16Transformer {
|
|
|
857
857
|
if (node.storage !== undefined) {
|
|
858
858
|
result.storage = node.storage;
|
|
859
859
|
}
|
|
860
|
+
if (node.compression !== undefined) {
|
|
861
|
+
result.compression = node.compression;
|
|
862
|
+
}
|
|
860
863
|
if (node.raw_default !== undefined) {
|
|
861
864
|
result.raw_default = this.transform(node.raw_default, context);
|
|
862
865
|
}
|
|
@@ -979,6 +982,11 @@ class V15ToV16Transformer {
|
|
|
979
982
|
if (node.fk_del_action !== undefined) {
|
|
980
983
|
result.fk_del_action = node.fk_del_action;
|
|
981
984
|
}
|
|
985
|
+
if (node.fk_del_set_cols !== undefined) {
|
|
986
|
+
result.fk_del_set_cols = Array.isArray(node.fk_del_set_cols)
|
|
987
|
+
? node.fk_del_set_cols.map((item) => this.transform(item, context))
|
|
988
|
+
: this.transform(node.fk_del_set_cols, context);
|
|
989
|
+
}
|
|
982
990
|
if (node.old_conpfeqop !== undefined) {
|
|
983
991
|
result.old_conpfeqop = Array.isArray(node.old_conpfeqop)
|
|
984
992
|
? node.old_conpfeqop.map((item) => this.transform(item, context))
|
|
@@ -2554,13 +2562,13 @@ class V15ToV16Transformer {
|
|
|
2554
2562
|
result.opt = [
|
|
2555
2563
|
{
|
|
2556
2564
|
DefElem: {
|
|
2557
|
-
defname:
|
|
2565
|
+
defname: 'admin',
|
|
2558
2566
|
arg: {
|
|
2559
2567
|
Boolean: {
|
|
2560
2568
|
boolval: true
|
|
2561
2569
|
}
|
|
2562
2570
|
},
|
|
2563
|
-
defaction:
|
|
2571
|
+
defaction: 'DEFELEM_UNSPEC'
|
|
2564
2572
|
}
|
|
2565
2573
|
}
|
|
2566
2574
|
];
|
|
@@ -2571,6 +2579,9 @@ class V15ToV16Transformer {
|
|
|
2571
2579
|
? nodeAny.opt.map((item) => this.transform(item, context))
|
|
2572
2580
|
: this.transform(nodeAny.opt, context);
|
|
2573
2581
|
}
|
|
2582
|
+
if (node.grantor !== undefined) {
|
|
2583
|
+
result.grantor = node.grantor;
|
|
2584
|
+
}
|
|
2574
2585
|
return { GrantRoleStmt: result };
|
|
2575
2586
|
}
|
|
2576
2587
|
SecLabelStmt(node, context) {
|
package/v16-to-v17.d.ts
CHANGED
|
@@ -496,6 +496,9 @@ export declare class V16ToV17Transformer {
|
|
|
496
496
|
MergeStmt(node: any, context: any): {
|
|
497
497
|
MergeStmt: any;
|
|
498
498
|
};
|
|
499
|
+
MergeWhenClause(node: any, context: any): {
|
|
500
|
+
MergeWhenClause: any;
|
|
501
|
+
};
|
|
499
502
|
AlterTableMoveAllStmt(node: any, context: any): {
|
|
500
503
|
AlterTableMoveAllStmt: any;
|
|
501
504
|
};
|
package/v16-to-v17.js
CHANGED
|
@@ -655,6 +655,12 @@ class V16ToV17Transformer {
|
|
|
655
655
|
if (node.storage !== undefined) {
|
|
656
656
|
result.storage = node.storage;
|
|
657
657
|
}
|
|
658
|
+
if (node.storage_name !== undefined) {
|
|
659
|
+
result.storage_name = node.storage_name;
|
|
660
|
+
}
|
|
661
|
+
if (node.compression !== undefined) {
|
|
662
|
+
result.compression = node.compression;
|
|
663
|
+
}
|
|
658
664
|
if (node.raw_default !== undefined) {
|
|
659
665
|
result.raw_default = this.transform(node.raw_default, context);
|
|
660
666
|
}
|
|
@@ -1113,7 +1119,50 @@ class V16ToV17Transformer {
|
|
|
1113
1119
|
return { AlterOpFamilyStmt: node };
|
|
1114
1120
|
}
|
|
1115
1121
|
MergeStmt(node, context) {
|
|
1116
|
-
|
|
1122
|
+
const result = {};
|
|
1123
|
+
if (node.relation !== undefined) {
|
|
1124
|
+
result.relation = node.relation;
|
|
1125
|
+
}
|
|
1126
|
+
if (node.sourceRelation !== undefined) {
|
|
1127
|
+
result.sourceRelation = this.transform(node.sourceRelation, context);
|
|
1128
|
+
}
|
|
1129
|
+
if (node.joinCondition !== undefined) {
|
|
1130
|
+
result.joinCondition = this.transform(node.joinCondition, context);
|
|
1131
|
+
}
|
|
1132
|
+
if (node.mergeWhenClauses !== undefined) {
|
|
1133
|
+
result.mergeWhenClauses = Array.isArray(node.mergeWhenClauses)
|
|
1134
|
+
? node.mergeWhenClauses.map(item => this.transform(item, context))
|
|
1135
|
+
: this.transform(node.mergeWhenClauses, context);
|
|
1136
|
+
}
|
|
1137
|
+
if (node.withClause !== undefined) {
|
|
1138
|
+
result.withClause = this.WithClause(node.withClause, context);
|
|
1139
|
+
}
|
|
1140
|
+
return { MergeStmt: result };
|
|
1141
|
+
}
|
|
1142
|
+
MergeWhenClause(node, context) {
|
|
1143
|
+
const result = {};
|
|
1144
|
+
// v17 replaces the boolean matched with matchKind
|
|
1145
|
+
result.matchKind = node.matched ? 'MERGE_WHEN_MATCHED' : 'MERGE_WHEN_NOT_MATCHED_BY_TARGET';
|
|
1146
|
+
if (node.commandType !== undefined) {
|
|
1147
|
+
result.commandType = node.commandType;
|
|
1148
|
+
}
|
|
1149
|
+
if (node.override !== undefined) {
|
|
1150
|
+
result.override = node.override;
|
|
1151
|
+
}
|
|
1152
|
+
if (node.condition !== undefined) {
|
|
1153
|
+
result.condition = this.transform(node.condition, context);
|
|
1154
|
+
}
|
|
1155
|
+
if (node.targetList !== undefined) {
|
|
1156
|
+
result.targetList = Array.isArray(node.targetList)
|
|
1157
|
+
? node.targetList.map(item => this.transform(item, context))
|
|
1158
|
+
: this.transform(node.targetList, context);
|
|
1159
|
+
}
|
|
1160
|
+
if (node.values !== undefined) {
|
|
1161
|
+
result.values = Array.isArray(node.values)
|
|
1162
|
+
? node.values.map(item => this.transform(item, context))
|
|
1163
|
+
: this.transform(node.values, context);
|
|
1164
|
+
}
|
|
1165
|
+
return { MergeWhenClause: result };
|
|
1117
1166
|
}
|
|
1118
1167
|
AlterTableMoveAllStmt(node, context) {
|
|
1119
1168
|
return { AlterTableMoveAllStmt: node };
|