@pgsql/transform 17.9.18 → 18.0.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/18/enums.d.ts +78 -0
- package/18/enums.js +2 -0
- package/18/types.d.ts +2538 -0
- package/18/types.js +2 -0
- package/esm/18/enums.js +1 -0
- package/esm/18/types.js +1 -0
- package/esm/index.js +8 -1
- package/esm/multi-version-transformer.js +21 -1
- package/esm/transformers/v13-to-v14.js +23 -1
- package/esm/transformers/v16-to-v17.js +44 -1
- package/esm/transformers/v17-to-v18.js +204 -0
- package/esm/transformers-direct/index.js +6 -1
- package/esm/transformers-direct/v13-to-v18/index.js +84 -0
- package/esm/transformers-direct/v14-to-v18/index.js +73 -0
- package/esm/transformers-direct/v15-to-v18/index.js +62 -0
- package/esm/transformers-direct/v16-to-v18/index.js +51 -0
- package/esm/transformers-direct/v17-to-v18/index.js +39 -0
- package/index.d.ts +9 -1
- package/index.js +15 -1
- package/multi-version-transformer.d.ts +5 -0
- package/multi-version-transformer.js +21 -1
- package/package.json +5 -3
- package/transformers/v13-to-v14.d.ts +3 -0
- package/transformers/v13-to-v14.js +23 -1
- package/transformers/v16-to-v17.d.ts +3 -0
- package/transformers/v16-to-v17.js +44 -1
- package/transformers/v17-to-v18.d.ts +54 -0
- package/transformers/v17-to-v18.js +208 -0
- package/transformers-direct/index.d.ts +6 -1
- package/transformers-direct/index.js +12 -2
- package/transformers-direct/v13-to-v18/index.d.ts +28 -0
- package/transformers-direct/v13-to-v18/index.js +88 -0
- package/transformers-direct/v14-to-v18/index.d.ts +27 -0
- package/transformers-direct/v14-to-v18/index.js +77 -0
- package/transformers-direct/v15-to-v18/index.d.ts +26 -0
- package/transformers-direct/v15-to-v18/index.js +66 -0
- package/transformers-direct/v16-to-v18/index.d.ts +25 -0
- package/transformers-direct/v16-to-v18/index.js +55 -0
- package/transformers-direct/v17-to-v18/index.d.ts +24 -0
- package/transformers-direct/v17-to-v18/index.js +43 -0
package/18/types.js
ADDED
package/esm/18/enums.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/esm/18/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/esm/index.js
CHANGED
|
@@ -3,13 +3,20 @@ import * as PG14Types from './14/types';
|
|
|
3
3
|
import * as PG15Types from './15/types';
|
|
4
4
|
import * as PG16Types from './16/types';
|
|
5
5
|
import * as PG17Types from './17/types';
|
|
6
|
+
import * as PG18Types from './18/types';
|
|
6
7
|
export { ASTTransformer } from './multi-version-transformer';
|
|
7
8
|
export { V13ToV14Transformer } from './transformers/v13-to-v14';
|
|
8
9
|
export { V14ToV15Transformer } from './transformers/v14-to-v15';
|
|
9
10
|
export { V15ToV16Transformer } from './transformers/v15-to-v16';
|
|
10
11
|
export { V16ToV17Transformer } from './transformers/v16-to-v17';
|
|
12
|
+
export { V17ToV18Transformer } from './transformers/v17-to-v18';
|
|
11
13
|
export { PG13ToPG17Transformer } from './transformers-direct/v13-to-v17';
|
|
12
14
|
export { PG14ToPG17Transformer } from './transformers-direct/v14-to-v17';
|
|
13
15
|
export { PG15ToPG17Transformer } from './transformers-direct/v15-to-v17';
|
|
14
16
|
export { PG16ToPG17Transformer } from './transformers-direct/v16-to-v17';
|
|
15
|
-
export {
|
|
17
|
+
export { PG13ToPG18Transformer } from './transformers-direct/v13-to-v18';
|
|
18
|
+
export { PG14ToPG18Transformer } from './transformers-direct/v14-to-v18';
|
|
19
|
+
export { PG15ToPG18Transformer } from './transformers-direct/v15-to-v18';
|
|
20
|
+
export { PG16ToPG18Transformer } from './transformers-direct/v16-to-v18';
|
|
21
|
+
export { PG17ToPG18Transformer } from './transformers-direct/v17-to-v18';
|
|
22
|
+
export { PG13Types, PG14Types, PG15Types, PG16Types, PG17Types, PG18Types };
|
|
@@ -2,12 +2,14 @@ import { V13ToV14Transformer } from './transformers/v13-to-v14';
|
|
|
2
2
|
import { V14ToV15Transformer } from './transformers/v14-to-v15';
|
|
3
3
|
import { V15ToV16Transformer } from './transformers/v15-to-v16';
|
|
4
4
|
import { V16ToV17Transformer } from './transformers/v16-to-v17';
|
|
5
|
+
import { V17ToV18Transformer } from './transformers/v17-to-v18';
|
|
5
6
|
export class ASTTransformer {
|
|
6
7
|
transformers = {
|
|
7
8
|
'13-14': new V13ToV14Transformer(),
|
|
8
9
|
'14-15': new V14ToV15Transformer(),
|
|
9
10
|
'15-16': new V15ToV16Transformer(),
|
|
10
11
|
'16-17': new V16ToV17Transformer(),
|
|
12
|
+
'17-18': new V17ToV18Transformer(),
|
|
11
13
|
};
|
|
12
14
|
transform(ast, fromVersion, toVersion) {
|
|
13
15
|
if (fromVersion === toVersion) {
|
|
@@ -35,6 +37,9 @@ export class ASTTransformer {
|
|
|
35
37
|
case '16-17':
|
|
36
38
|
currentAst = this.transformers['16-17'].transform(currentAst, { parentNodeTypes: [] });
|
|
37
39
|
break;
|
|
40
|
+
case '17-18':
|
|
41
|
+
currentAst = this.transformers['17-18'].transform(currentAst, { parentNodeTypes: [] });
|
|
42
|
+
break;
|
|
38
43
|
default:
|
|
39
44
|
throw new Error(`No transformer available for v${currentVersion} to v${nextVersion}`);
|
|
40
45
|
}
|
|
@@ -43,7 +48,7 @@ export class ASTTransformer {
|
|
|
43
48
|
return currentAst;
|
|
44
49
|
}
|
|
45
50
|
transformToLatest(ast, fromVersion) {
|
|
46
|
-
return this.transform(ast, fromVersion,
|
|
51
|
+
return this.transform(ast, fromVersion, 18);
|
|
47
52
|
}
|
|
48
53
|
transform13To17(ast) {
|
|
49
54
|
return this.transform(ast, 13, 17);
|
|
@@ -57,4 +62,19 @@ export class ASTTransformer {
|
|
|
57
62
|
transform16To17(ast) {
|
|
58
63
|
return this.transform(ast, 16, 17);
|
|
59
64
|
}
|
|
65
|
+
transform13To18(ast) {
|
|
66
|
+
return this.transform(ast, 13, 18);
|
|
67
|
+
}
|
|
68
|
+
transform14To18(ast) {
|
|
69
|
+
return this.transform(ast, 14, 18);
|
|
70
|
+
}
|
|
71
|
+
transform15To18(ast) {
|
|
72
|
+
return this.transform(ast, 15, 18);
|
|
73
|
+
}
|
|
74
|
+
transform16To18(ast) {
|
|
75
|
+
return this.transform(ast, 16, 18);
|
|
76
|
+
}
|
|
77
|
+
transform17To18(ast) {
|
|
78
|
+
return this.transform(ast, 17, 18);
|
|
79
|
+
}
|
|
60
80
|
}
|
|
@@ -1632,6 +1632,25 @@ export class V13ToV14Transformer {
|
|
|
1632
1632
|
// Functions like testfunc1(int), testfunc2(int), testfunc4(boolean) should NOT have parameter names
|
|
1633
1633
|
return undefined;
|
|
1634
1634
|
}
|
|
1635
|
+
AlterExtensionContentsStmt(node, context) {
|
|
1636
|
+
const result = {};
|
|
1637
|
+
const childContext = {
|
|
1638
|
+
...context,
|
|
1639
|
+
alterExtensionObjtype: node.objtype
|
|
1640
|
+
};
|
|
1641
|
+
for (const [key, value] of Object.entries(node)) {
|
|
1642
|
+
if (Array.isArray(value)) {
|
|
1643
|
+
result[key] = value.map(item => this.transform(item, childContext));
|
|
1644
|
+
}
|
|
1645
|
+
else if (typeof value === 'object' && value !== null) {
|
|
1646
|
+
result[key] = this.transform(value, childContext);
|
|
1647
|
+
}
|
|
1648
|
+
else {
|
|
1649
|
+
result[key] = value;
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
return { AlterExtensionContentsStmt: result };
|
|
1653
|
+
}
|
|
1635
1654
|
ObjectWithArgs(node, context) {
|
|
1636
1655
|
const result = { ...node };
|
|
1637
1656
|
if (result.objname !== undefined) {
|
|
@@ -1833,6 +1852,9 @@ export class V13ToV14Transformer {
|
|
|
1833
1852
|
if (!context.parentNodeTypes || context.parentNodeTypes.length === 0) {
|
|
1834
1853
|
return false;
|
|
1835
1854
|
}
|
|
1855
|
+
if (context.alterExtensionObjtype === 'OBJECT_OPERATOR') {
|
|
1856
|
+
return false;
|
|
1857
|
+
}
|
|
1836
1858
|
if (context.commentObjtype === 'OBJECT_OPERATOR' &&
|
|
1837
1859
|
context.parentNodeTypes.includes('CommentStmt')) {
|
|
1838
1860
|
return false;
|
|
@@ -1889,7 +1911,7 @@ export class V13ToV14Transformer {
|
|
|
1889
1911
|
}
|
|
1890
1912
|
}
|
|
1891
1913
|
const allowedNodeTypes = [
|
|
1892
|
-
'CommentStmt', 'AlterFunctionStmt', 'RenameStmt', 'AlterOwnerStmt', 'AlterObjectSchemaStmt', 'CreateCastStmt', 'CreateTransformStmt', 'AlterOpFamilyStmt', 'CreateOpClassItem', 'GrantStmt', 'RevokeStmt'
|
|
1914
|
+
'CommentStmt', 'AlterFunctionStmt', 'RenameStmt', 'AlterOwnerStmt', 'AlterObjectSchemaStmt', 'CreateCastStmt', 'CreateTransformStmt', 'AlterOpFamilyStmt', 'CreateOpClassItem', 'GrantStmt', 'RevokeStmt', 'AlterExtensionContentsStmt'
|
|
1893
1915
|
];
|
|
1894
1916
|
for (const node of path) {
|
|
1895
1917
|
if (node && typeof node === 'object') {
|
|
@@ -1105,7 +1105,50 @@ export class V16ToV17Transformer {
|
|
|
1105
1105
|
return { AlterOpFamilyStmt: node };
|
|
1106
1106
|
}
|
|
1107
1107
|
MergeStmt(node, context) {
|
|
1108
|
-
|
|
1108
|
+
const result = {};
|
|
1109
|
+
if (node.relation !== undefined) {
|
|
1110
|
+
result.relation = node.relation;
|
|
1111
|
+
}
|
|
1112
|
+
if (node.sourceRelation !== undefined) {
|
|
1113
|
+
result.sourceRelation = this.transform(node.sourceRelation, context);
|
|
1114
|
+
}
|
|
1115
|
+
if (node.joinCondition !== undefined) {
|
|
1116
|
+
result.joinCondition = this.transform(node.joinCondition, context);
|
|
1117
|
+
}
|
|
1118
|
+
if (node.mergeWhenClauses !== undefined) {
|
|
1119
|
+
result.mergeWhenClauses = Array.isArray(node.mergeWhenClauses)
|
|
1120
|
+
? node.mergeWhenClauses.map(item => this.transform(item, context))
|
|
1121
|
+
: this.transform(node.mergeWhenClauses, context);
|
|
1122
|
+
}
|
|
1123
|
+
if (node.withClause !== undefined) {
|
|
1124
|
+
result.withClause = this.WithClause(node.withClause, context);
|
|
1125
|
+
}
|
|
1126
|
+
return { MergeStmt: result };
|
|
1127
|
+
}
|
|
1128
|
+
MergeWhenClause(node, context) {
|
|
1129
|
+
const result = {};
|
|
1130
|
+
// v17 replaces the boolean matched with matchKind
|
|
1131
|
+
result.matchKind = node.matched ? 'MERGE_WHEN_MATCHED' : 'MERGE_WHEN_NOT_MATCHED_BY_TARGET';
|
|
1132
|
+
if (node.commandType !== undefined) {
|
|
1133
|
+
result.commandType = node.commandType;
|
|
1134
|
+
}
|
|
1135
|
+
if (node.override !== undefined) {
|
|
1136
|
+
result.override = node.override;
|
|
1137
|
+
}
|
|
1138
|
+
if (node.condition !== undefined) {
|
|
1139
|
+
result.condition = this.transform(node.condition, context);
|
|
1140
|
+
}
|
|
1141
|
+
if (node.targetList !== undefined) {
|
|
1142
|
+
result.targetList = Array.isArray(node.targetList)
|
|
1143
|
+
? node.targetList.map(item => this.transform(item, context))
|
|
1144
|
+
: this.transform(node.targetList, context);
|
|
1145
|
+
}
|
|
1146
|
+
if (node.values !== undefined) {
|
|
1147
|
+
result.values = Array.isArray(node.values)
|
|
1148
|
+
? node.values.map(item => this.transform(item, context))
|
|
1149
|
+
: this.transform(node.values, context);
|
|
1150
|
+
}
|
|
1151
|
+
return { MergeWhenClause: result };
|
|
1109
1152
|
}
|
|
1110
1153
|
AlterTableMoveAllStmt(node, context) {
|
|
1111
1154
|
return { AlterTableMoveAllStmt: node };
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V17 to V18 AST Transformer
|
|
3
|
+
* Transforms PostgreSQL v17 AST nodes to v18 format
|
|
4
|
+
*
|
|
5
|
+
* Structural changes in v18:
|
|
6
|
+
* - InsertStmt/UpdateStmt/DeleteStmt/MergeStmt: returningList -> returningClause { exprs }
|
|
7
|
+
* - Constraint: new is_enforced flag (true by default for CHECK/FOREIGN/NOTNULL)
|
|
8
|
+
* - Constraint: CONSTR_GENERATED gains generated_kind ('s' = STORED, 'v' = VIRTUAL)
|
|
9
|
+
* - Column-level NOT NULL constraints gain initially_valid: true
|
|
10
|
+
*/
|
|
11
|
+
export class V17ToV18Transformer {
|
|
12
|
+
transform(node, context = { parentNodeTypes: [] }) {
|
|
13
|
+
if (node == null) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (typeof node === 'number' || node instanceof Number) {
|
|
17
|
+
return node;
|
|
18
|
+
}
|
|
19
|
+
if (typeof node === 'string') {
|
|
20
|
+
return node;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
return this.visit(node, context);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const nodeType = Object.keys(node)[0];
|
|
27
|
+
throw new Error(`Error transforming ${nodeType}: ${error.message}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
visit(node, context = { parentNodeTypes: [] }) {
|
|
31
|
+
if (node && typeof node === 'object' && 'version' in node && 'stmts' in node) {
|
|
32
|
+
return this.ParseResult(node, context);
|
|
33
|
+
}
|
|
34
|
+
const nodeType = this.getNodeType(node);
|
|
35
|
+
// Handle empty objects
|
|
36
|
+
if (!nodeType) {
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
39
|
+
const nodeData = this.getNodeData(node);
|
|
40
|
+
const methodName = nodeType;
|
|
41
|
+
if (typeof this[methodName] === 'function') {
|
|
42
|
+
const childContext = {
|
|
43
|
+
...context,
|
|
44
|
+
parentNodeTypes: [...context.parentNodeTypes, nodeType]
|
|
45
|
+
};
|
|
46
|
+
const result = this[methodName](nodeData, childContext);
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
// No specific method: recurse into children so nested statements
|
|
50
|
+
// (e.g. DML inside CTEs) still get transformed
|
|
51
|
+
return this.walkValue(node, context);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Generic recursive walk that re-dispatches wrapped nodes with a
|
|
55
|
+
* dedicated transformer method and deep-copies everything else.
|
|
56
|
+
*/
|
|
57
|
+
walkValue(value, context) {
|
|
58
|
+
if (value == null || typeof value !== 'object') {
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
if (Array.isArray(value)) {
|
|
62
|
+
return value.map(item => this.walkValue(item, context));
|
|
63
|
+
}
|
|
64
|
+
const keys = Object.keys(value);
|
|
65
|
+
if (keys.length === 1 && typeof this[keys[0]] === 'function') {
|
|
66
|
+
// Wrapped node with a dedicated transformer method
|
|
67
|
+
return this.visit(value, context);
|
|
68
|
+
}
|
|
69
|
+
const result = {};
|
|
70
|
+
for (const key of keys) {
|
|
71
|
+
result[key] = this.walkValue(value[key], context);
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
getNodeType(node) {
|
|
76
|
+
return Object.keys(node)[0];
|
|
77
|
+
}
|
|
78
|
+
getNodeData(node) {
|
|
79
|
+
const keys = Object.keys(node);
|
|
80
|
+
if (keys.length === 1 && typeof node[keys[0]] === 'object') {
|
|
81
|
+
return node[keys[0]];
|
|
82
|
+
}
|
|
83
|
+
return node;
|
|
84
|
+
}
|
|
85
|
+
ParseResult(node, context) {
|
|
86
|
+
if (node && typeof node === 'object' && 'version' in node && 'stmts' in node) {
|
|
87
|
+
return {
|
|
88
|
+
version: 180004, // PG18 version
|
|
89
|
+
stmts: node.stmts.map((stmt) => {
|
|
90
|
+
if (stmt && typeof stmt === 'object' && 'stmt' in stmt) {
|
|
91
|
+
return {
|
|
92
|
+
...stmt,
|
|
93
|
+
stmt: this.transform(stmt.stmt, context)
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return this.transform(stmt, context);
|
|
97
|
+
})
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return node;
|
|
101
|
+
}
|
|
102
|
+
RawStmt(node, context) {
|
|
103
|
+
const result = {};
|
|
104
|
+
if (node.stmt !== undefined) {
|
|
105
|
+
result.stmt = this.transform(node.stmt, context);
|
|
106
|
+
}
|
|
107
|
+
if (node.stmt_location !== undefined) {
|
|
108
|
+
result.stmt_location = node.stmt_location;
|
|
109
|
+
}
|
|
110
|
+
if (node.stmt_len !== undefined) {
|
|
111
|
+
result.stmt_len = node.stmt_len;
|
|
112
|
+
}
|
|
113
|
+
return { RawStmt: result };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Convert a v17 returningList into a v18 ReturningClause
|
|
117
|
+
*/
|
|
118
|
+
transformReturningList(returningList, context) {
|
|
119
|
+
return {
|
|
120
|
+
exprs: returningList.map(item => this.transform(item, context))
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
transformDmlStatement(nodeType, node, context) {
|
|
124
|
+
const result = {};
|
|
125
|
+
for (const key of Object.keys(node)) {
|
|
126
|
+
if (key === 'returningList') {
|
|
127
|
+
result.returningClause = this.transformReturningList(node.returningList, context);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
result[key] = this.walkValue(node[key], context);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return { [nodeType]: result };
|
|
134
|
+
}
|
|
135
|
+
InsertStmt(node, context) {
|
|
136
|
+
return this.transformDmlStatement('InsertStmt', node, context);
|
|
137
|
+
}
|
|
138
|
+
UpdateStmt(node, context) {
|
|
139
|
+
return this.transformDmlStatement('UpdateStmt', node, context);
|
|
140
|
+
}
|
|
141
|
+
DeleteStmt(node, context) {
|
|
142
|
+
return this.transformDmlStatement('DeleteStmt', node, context);
|
|
143
|
+
}
|
|
144
|
+
MergeStmt(node, context) {
|
|
145
|
+
return this.transformDmlStatement('MergeStmt', node, context);
|
|
146
|
+
}
|
|
147
|
+
AlterTableCmd(node, context) {
|
|
148
|
+
const result = {};
|
|
149
|
+
for (const key of Object.keys(node)) {
|
|
150
|
+
result[key] = this.walkValue(node[key], context);
|
|
151
|
+
}
|
|
152
|
+
// v18 wraps ALTER CONSTRAINT definitions in the new ATAlterConstraint node
|
|
153
|
+
if (node.subtype === 'AT_AlterConstraint' && node.def?.Constraint) {
|
|
154
|
+
const constraint = node.def.Constraint;
|
|
155
|
+
const alterConstraint = {};
|
|
156
|
+
if (constraint.conname !== undefined) {
|
|
157
|
+
alterConstraint.conname = constraint.conname;
|
|
158
|
+
}
|
|
159
|
+
alterConstraint.is_enforced = true;
|
|
160
|
+
// v17 ALTER CONSTRAINT could only change deferrability
|
|
161
|
+
alterConstraint.alterDeferrability = true;
|
|
162
|
+
if (constraint.deferrable !== undefined) {
|
|
163
|
+
alterConstraint.deferrable = constraint.deferrable;
|
|
164
|
+
}
|
|
165
|
+
if (constraint.initdeferred !== undefined) {
|
|
166
|
+
alterConstraint.initdeferred = constraint.initdeferred;
|
|
167
|
+
}
|
|
168
|
+
result.def = { ATAlterConstraint: alterConstraint };
|
|
169
|
+
}
|
|
170
|
+
return { AlterTableCmd: result };
|
|
171
|
+
}
|
|
172
|
+
VariableSetStmt(node, context) {
|
|
173
|
+
const result = {};
|
|
174
|
+
for (const key of Object.keys(node)) {
|
|
175
|
+
result[key] = this.walkValue(node[key], context);
|
|
176
|
+
}
|
|
177
|
+
// v18 marks SET TRANSACTION / SESSION CHARACTERISTICS args as jumbled
|
|
178
|
+
if (node.kind === 'VAR_SET_MULTI' && (node.name === 'TRANSACTION' || node.name === 'SESSION CHARACTERISTICS')) {
|
|
179
|
+
result.jumble_args = true;
|
|
180
|
+
}
|
|
181
|
+
return { VariableSetStmt: result };
|
|
182
|
+
}
|
|
183
|
+
Constraint(node, context) {
|
|
184
|
+
const result = {};
|
|
185
|
+
for (const key of Object.keys(node)) {
|
|
186
|
+
result[key] = this.walkValue(node[key], context);
|
|
187
|
+
}
|
|
188
|
+
// v18 constraints are enforced by default; v17 grammar had no ENFORCED syntax
|
|
189
|
+
if (node.contype === 'CONSTR_CHECK' || node.contype === 'CONSTR_FOREIGN') {
|
|
190
|
+
result.is_enforced = true;
|
|
191
|
+
}
|
|
192
|
+
if (node.contype === 'CONSTR_NOTNULL') {
|
|
193
|
+
// v17 only produces column-level NOT NULL constraints, which in v18
|
|
194
|
+
// carry is_enforced and initially_valid
|
|
195
|
+
result.is_enforced = true;
|
|
196
|
+
result.initially_valid = true;
|
|
197
|
+
}
|
|
198
|
+
if (node.contype === 'CONSTR_GENERATED' && result.generated_kind === undefined) {
|
|
199
|
+
// v17 only supports STORED generated columns
|
|
200
|
+
result.generated_kind = 's';
|
|
201
|
+
}
|
|
202
|
+
return { Constraint: result };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Direct transformers for PostgreSQL version upgrades to PG17
|
|
2
|
+
* Direct transformers for PostgreSQL version upgrades to PG17/PG18
|
|
3
3
|
* These transformers are designed for tree-shaking optimization
|
|
4
4
|
*/
|
|
5
5
|
export { PG13ToPG17Transformer } from './v13-to-v17';
|
|
6
6
|
export { PG14ToPG17Transformer } from './v14-to-v17';
|
|
7
7
|
export { PG15ToPG17Transformer } from './v15-to-v17';
|
|
8
8
|
export { PG16ToPG17Transformer } from './v16-to-v17';
|
|
9
|
+
export { PG13ToPG18Transformer } from './v13-to-v18';
|
|
10
|
+
export { PG14ToPG18Transformer } from './v14-to-v18';
|
|
11
|
+
export { PG15ToPG18Transformer } from './v15-to-v18';
|
|
12
|
+
export { PG16ToPG18Transformer } from './v16-to-v18';
|
|
13
|
+
export { PG17ToPG18Transformer } from './v17-to-v18';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { V13ToV14Transformer } from '../../transformers/v13-to-v14';
|
|
2
|
+
import { V14ToV15Transformer } from '../../transformers/v14-to-v15';
|
|
3
|
+
import { V15ToV16Transformer } from '../../transformers/v15-to-v16';
|
|
4
|
+
import { V16ToV17Transformer } from '../../transformers/v16-to-v17';
|
|
5
|
+
import { V17ToV18Transformer } from '../../transformers/v17-to-v18';
|
|
6
|
+
/**
|
|
7
|
+
* Direct transformer from PG13 to PG18
|
|
8
|
+
* This transformer chains v13->...->v18 transformations
|
|
9
|
+
*/
|
|
10
|
+
export class PG13ToPG18Transformer {
|
|
11
|
+
v13to14 = new V13ToV14Transformer();
|
|
12
|
+
v14to15 = new V14ToV15Transformer();
|
|
13
|
+
v15to16 = new V15ToV16Transformer();
|
|
14
|
+
v16to17 = new V16ToV17Transformer();
|
|
15
|
+
v17to18 = new V17ToV18Transformer();
|
|
16
|
+
transform(node) {
|
|
17
|
+
if (this.isParseResult(node)) {
|
|
18
|
+
// Transform through the chain: v13->v14->v15->v16->v17->v18
|
|
19
|
+
const v14Stmts = node.stmts.map((stmtWrapper) => {
|
|
20
|
+
if (stmtWrapper.stmt) {
|
|
21
|
+
const stmt = this.v13to14.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
22
|
+
return { ...stmtWrapper, stmt };
|
|
23
|
+
}
|
|
24
|
+
return stmtWrapper;
|
|
25
|
+
});
|
|
26
|
+
const v15Stmts = v14Stmts.map((stmtWrapper) => {
|
|
27
|
+
if (stmtWrapper.stmt) {
|
|
28
|
+
const stmt = this.v14to15.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
29
|
+
return { ...stmtWrapper, stmt };
|
|
30
|
+
}
|
|
31
|
+
return stmtWrapper;
|
|
32
|
+
});
|
|
33
|
+
const v16Stmts = v15Stmts.map((stmtWrapper) => {
|
|
34
|
+
if (stmtWrapper.stmt) {
|
|
35
|
+
const stmt = this.v15to16.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
36
|
+
return { ...stmtWrapper, stmt };
|
|
37
|
+
}
|
|
38
|
+
return stmtWrapper;
|
|
39
|
+
});
|
|
40
|
+
const v17Stmts = v16Stmts.map((stmtWrapper) => {
|
|
41
|
+
if (stmtWrapper.stmt) {
|
|
42
|
+
const stmt = this.v16to17.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
43
|
+
return { ...stmtWrapper, stmt };
|
|
44
|
+
}
|
|
45
|
+
return stmtWrapper;
|
|
46
|
+
});
|
|
47
|
+
const v18Stmts = v17Stmts.map((stmtWrapper) => {
|
|
48
|
+
if (stmtWrapper.stmt) {
|
|
49
|
+
const stmt = this.v17to18.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
50
|
+
return { ...stmtWrapper, stmt };
|
|
51
|
+
}
|
|
52
|
+
return stmtWrapper;
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
...node,
|
|
56
|
+
version: 180004, // PG18 version
|
|
57
|
+
stmts: v18Stmts
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Otherwise, transform as a regular node through the chain
|
|
61
|
+
const v14Node = this.v13to14.transform(node, { parentNodeTypes: [] });
|
|
62
|
+
const v15Node = this.v14to15.transform(v14Node, { parentNodeTypes: [] });
|
|
63
|
+
const v16Node = this.v15to16.transform(v15Node, { parentNodeTypes: [] });
|
|
64
|
+
const v17Node = this.v16to17.transform(v16Node, { parentNodeTypes: [] });
|
|
65
|
+
return this.v17to18.transform(v17Node, { parentNodeTypes: [] });
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Transform a single statement from PG13 to PG18
|
|
69
|
+
* @deprecated Use transform() instead, which handles all node types
|
|
70
|
+
*/
|
|
71
|
+
transformStatement(stmt) {
|
|
72
|
+
const v14Stmt = this.v13to14.transform(stmt, { parentNodeTypes: [] });
|
|
73
|
+
const v15Stmt = this.v14to15.transform(v14Stmt, { parentNodeTypes: [] });
|
|
74
|
+
const v16Stmt = this.v15to16.transform(v15Stmt, { parentNodeTypes: [] });
|
|
75
|
+
const v17Stmt = this.v16to17.transform(v16Stmt, { parentNodeTypes: [] });
|
|
76
|
+
return this.v17to18.transform(v17Stmt, { parentNodeTypes: [] });
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Type guard to check if a node is a ParseResult
|
|
80
|
+
*/
|
|
81
|
+
isParseResult(node) {
|
|
82
|
+
return node && typeof node === 'object' && 'version' in node && 'stmts' in node;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { V14ToV15Transformer } from '../../transformers/v14-to-v15';
|
|
2
|
+
import { V15ToV16Transformer } from '../../transformers/v15-to-v16';
|
|
3
|
+
import { V16ToV17Transformer } from '../../transformers/v16-to-v17';
|
|
4
|
+
import { V17ToV18Transformer } from '../../transformers/v17-to-v18';
|
|
5
|
+
/**
|
|
6
|
+
* Direct transformer from PG14 to PG18
|
|
7
|
+
* This transformer chains v14->...->v18 transformations
|
|
8
|
+
*/
|
|
9
|
+
export class PG14ToPG18Transformer {
|
|
10
|
+
v14to15 = new V14ToV15Transformer();
|
|
11
|
+
v15to16 = new V15ToV16Transformer();
|
|
12
|
+
v16to17 = new V16ToV17Transformer();
|
|
13
|
+
v17to18 = new V17ToV18Transformer();
|
|
14
|
+
transform(node) {
|
|
15
|
+
if (this.isParseResult(node)) {
|
|
16
|
+
// Transform through the chain: v14->v15->v16->v17->v18
|
|
17
|
+
const v15Stmts = node.stmts.map((stmtWrapper) => {
|
|
18
|
+
if (stmtWrapper.stmt) {
|
|
19
|
+
const stmt = this.v14to15.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
20
|
+
return { ...stmtWrapper, stmt };
|
|
21
|
+
}
|
|
22
|
+
return stmtWrapper;
|
|
23
|
+
});
|
|
24
|
+
const v16Stmts = v15Stmts.map((stmtWrapper) => {
|
|
25
|
+
if (stmtWrapper.stmt) {
|
|
26
|
+
const stmt = this.v15to16.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
27
|
+
return { ...stmtWrapper, stmt };
|
|
28
|
+
}
|
|
29
|
+
return stmtWrapper;
|
|
30
|
+
});
|
|
31
|
+
const v17Stmts = v16Stmts.map((stmtWrapper) => {
|
|
32
|
+
if (stmtWrapper.stmt) {
|
|
33
|
+
const stmt = this.v16to17.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
34
|
+
return { ...stmtWrapper, stmt };
|
|
35
|
+
}
|
|
36
|
+
return stmtWrapper;
|
|
37
|
+
});
|
|
38
|
+
const v18Stmts = v17Stmts.map((stmtWrapper) => {
|
|
39
|
+
if (stmtWrapper.stmt) {
|
|
40
|
+
const stmt = this.v17to18.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
41
|
+
return { ...stmtWrapper, stmt };
|
|
42
|
+
}
|
|
43
|
+
return stmtWrapper;
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
...node,
|
|
47
|
+
version: 180004, // PG18 version
|
|
48
|
+
stmts: v18Stmts
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Otherwise, transform as a regular node through the chain
|
|
52
|
+
const v15Node = this.v14to15.transform(node, { parentNodeTypes: [] });
|
|
53
|
+
const v16Node = this.v15to16.transform(v15Node, { parentNodeTypes: [] });
|
|
54
|
+
const v17Node = this.v16to17.transform(v16Node, { parentNodeTypes: [] });
|
|
55
|
+
return this.v17to18.transform(v17Node, { parentNodeTypes: [] });
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Transform a single statement from PG14 to PG18
|
|
59
|
+
* @deprecated Use transform() instead, which handles all node types
|
|
60
|
+
*/
|
|
61
|
+
transformStatement(stmt) {
|
|
62
|
+
const v15Stmt = this.v14to15.transform(stmt, { parentNodeTypes: [] });
|
|
63
|
+
const v16Stmt = this.v15to16.transform(v15Stmt, { parentNodeTypes: [] });
|
|
64
|
+
const v17Stmt = this.v16to17.transform(v16Stmt, { parentNodeTypes: [] });
|
|
65
|
+
return this.v17to18.transform(v17Stmt, { parentNodeTypes: [] });
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Type guard to check if a node is a ParseResult
|
|
69
|
+
*/
|
|
70
|
+
isParseResult(node) {
|
|
71
|
+
return node && typeof node === 'object' && 'version' in node && 'stmts' in node;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { V15ToV16Transformer } from '../../transformers/v15-to-v16';
|
|
2
|
+
import { V16ToV17Transformer } from '../../transformers/v16-to-v17';
|
|
3
|
+
import { V17ToV18Transformer } from '../../transformers/v17-to-v18';
|
|
4
|
+
/**
|
|
5
|
+
* Direct transformer from PG15 to PG18
|
|
6
|
+
* This transformer chains v15->...->v18 transformations
|
|
7
|
+
*/
|
|
8
|
+
export class PG15ToPG18Transformer {
|
|
9
|
+
v15to16 = new V15ToV16Transformer();
|
|
10
|
+
v16to17 = new V16ToV17Transformer();
|
|
11
|
+
v17to18 = new V17ToV18Transformer();
|
|
12
|
+
transform(node) {
|
|
13
|
+
if (this.isParseResult(node)) {
|
|
14
|
+
// Transform through the chain: v15->v16->v17->v18
|
|
15
|
+
const v16Stmts = node.stmts.map((stmtWrapper) => {
|
|
16
|
+
if (stmtWrapper.stmt) {
|
|
17
|
+
const stmt = this.v15to16.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
18
|
+
return { ...stmtWrapper, stmt };
|
|
19
|
+
}
|
|
20
|
+
return stmtWrapper;
|
|
21
|
+
});
|
|
22
|
+
const v17Stmts = v16Stmts.map((stmtWrapper) => {
|
|
23
|
+
if (stmtWrapper.stmt) {
|
|
24
|
+
const stmt = this.v16to17.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
25
|
+
return { ...stmtWrapper, stmt };
|
|
26
|
+
}
|
|
27
|
+
return stmtWrapper;
|
|
28
|
+
});
|
|
29
|
+
const v18Stmts = v17Stmts.map((stmtWrapper) => {
|
|
30
|
+
if (stmtWrapper.stmt) {
|
|
31
|
+
const stmt = this.v17to18.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
32
|
+
return { ...stmtWrapper, stmt };
|
|
33
|
+
}
|
|
34
|
+
return stmtWrapper;
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
...node,
|
|
38
|
+
version: 180004, // PG18 version
|
|
39
|
+
stmts: v18Stmts
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Otherwise, transform as a regular node through the chain
|
|
43
|
+
const v16Node = this.v15to16.transform(node, { parentNodeTypes: [] });
|
|
44
|
+
const v17Node = this.v16to17.transform(v16Node, { parentNodeTypes: [] });
|
|
45
|
+
return this.v17to18.transform(v17Node, { parentNodeTypes: [] });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Transform a single statement from PG15 to PG18
|
|
49
|
+
* @deprecated Use transform() instead, which handles all node types
|
|
50
|
+
*/
|
|
51
|
+
transformStatement(stmt) {
|
|
52
|
+
const v16Stmt = this.v15to16.transform(stmt, { parentNodeTypes: [] });
|
|
53
|
+
const v17Stmt = this.v16to17.transform(v16Stmt, { parentNodeTypes: [] });
|
|
54
|
+
return this.v17to18.transform(v17Stmt, { parentNodeTypes: [] });
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Type guard to check if a node is a ParseResult
|
|
58
|
+
*/
|
|
59
|
+
isParseResult(node) {
|
|
60
|
+
return node && typeof node === 'object' && 'version' in node && 'stmts' in node;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { V16ToV17Transformer } from '../../transformers/v16-to-v17';
|
|
2
|
+
import { V17ToV18Transformer } from '../../transformers/v17-to-v18';
|
|
3
|
+
/**
|
|
4
|
+
* Direct transformer from PG16 to PG18
|
|
5
|
+
* This transformer chains v16->...->v18 transformations
|
|
6
|
+
*/
|
|
7
|
+
export class PG16ToPG18Transformer {
|
|
8
|
+
v16to17 = new V16ToV17Transformer();
|
|
9
|
+
v17to18 = new V17ToV18Transformer();
|
|
10
|
+
transform(node) {
|
|
11
|
+
if (this.isParseResult(node)) {
|
|
12
|
+
// Transform through the chain: v16->v17->v18
|
|
13
|
+
const v17Stmts = node.stmts.map((stmtWrapper) => {
|
|
14
|
+
if (stmtWrapper.stmt) {
|
|
15
|
+
const stmt = this.v16to17.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
16
|
+
return { ...stmtWrapper, stmt };
|
|
17
|
+
}
|
|
18
|
+
return stmtWrapper;
|
|
19
|
+
});
|
|
20
|
+
const v18Stmts = v17Stmts.map((stmtWrapper) => {
|
|
21
|
+
if (stmtWrapper.stmt) {
|
|
22
|
+
const stmt = this.v17to18.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
|
|
23
|
+
return { ...stmtWrapper, stmt };
|
|
24
|
+
}
|
|
25
|
+
return stmtWrapper;
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
...node,
|
|
29
|
+
version: 180004, // PG18 version
|
|
30
|
+
stmts: v18Stmts
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Otherwise, transform as a regular node through the chain
|
|
34
|
+
const v17Node = this.v16to17.transform(node, { parentNodeTypes: [] });
|
|
35
|
+
return this.v17to18.transform(v17Node, { parentNodeTypes: [] });
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Transform a single statement from PG16 to PG18
|
|
39
|
+
* @deprecated Use transform() instead, which handles all node types
|
|
40
|
+
*/
|
|
41
|
+
transformStatement(stmt) {
|
|
42
|
+
const v17Stmt = this.v16to17.transform(stmt, { parentNodeTypes: [] });
|
|
43
|
+
return this.v17to18.transform(v17Stmt, { parentNodeTypes: [] });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Type guard to check if a node is a ParseResult
|
|
47
|
+
*/
|
|
48
|
+
isParseResult(node) {
|
|
49
|
+
return node && typeof node === 'object' && 'version' in node && 'stmts' in node;
|
|
50
|
+
}
|
|
51
|
+
}
|