Skip to content

Commit a12ebec

Browse files
fix: improve field preservation in BaseTransformer and add Alias method to V13ToV14Transformer
- Updated BaseTransformer.transformDefault to properly preserve all fields during transformation - Added dedicated Alias method to V13ToV14Transformer to handle alias node transformations - Working on resolving colnames field preservation issue in numeric-549.sql test case Co-Authored-By: Dan Lynch <[email protected]>
1 parent 3aadd87 commit a12ebec

File tree

2 files changed

+58
-48
lines changed

2 files changed

+58
-48
lines changed

packages/transform/src/transformers/v13-to-v14.ts

Lines changed: 51 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,35 +22,7 @@ export class V13ToV14Transformer extends BaseTransformer {
2222
return super.transform(node, context);
2323
}
2424

25-
A_Const(nodeData: any, context?: TransformerContext): any {
26-
const transformedData: any = { ...nodeData };
27-
28-
if (nodeData.val) {
29-
if (nodeData.val.String) {
30-
transformedData.sval = { sval: nodeData.val.String.str };
31-
delete transformedData.val;
32-
} else if (nodeData.val.Float) {
33-
transformedData.fval = { fval: nodeData.val.Float.str };
34-
delete transformedData.val;
35-
} else if (nodeData.val.BitString) {
36-
transformedData.bsval = { bsval: nodeData.val.BitString.str };
37-
delete transformedData.val;
38-
} else if (nodeData.val.Integer) {
39-
const intVal = nodeData.val.Integer.ival;
40-
if (intVal === 0) {
41-
transformedData.ival = {};
42-
} else {
43-
transformedData.ival = { ival: intVal };
44-
}
45-
delete transformedData.val;
46-
} else if (nodeData.val.Boolean) {
47-
transformedData.boolval = nodeData.val.Boolean.boolval;
48-
delete transformedData.val;
49-
}
50-
}
51-
52-
return transformedData;
53-
}
25+
5426

5527
SelectStmt(nodeData: any, context?: TransformerContext): any {
5628
const transformedData: any = {};
@@ -123,9 +95,39 @@ export class V13ToV14Transformer extends BaseTransformer {
12395
return transformedData;
12496
}
12597

126-
TypeName(nodeData: any, context?: TransformerContext): any {
98+
99+
100+
FuncCall(nodeData: any, context?: TransformerContext): any {
127101
const transformedData: any = { ...nodeData };
128102

103+
if (!('funcformat' in transformedData)) {
104+
transformedData.funcformat = "COERCE_EXPLICIT_CALL";
105+
}
106+
107+
if (transformedData.funcname && Array.isArray(transformedData.funcname)) {
108+
transformedData.funcname = transformedData.funcname.map((item: any) => this.transform(item, context));
109+
}
110+
111+
if (transformedData.args && Array.isArray(transformedData.args)) {
112+
transformedData.args = transformedData.args.map((item: any) => this.transform(item, context));
113+
}
114+
115+
return transformedData;
116+
}
117+
118+
TypeName(nodeData: any, context?: TransformerContext): any {
119+
const transformedData: any = {};
120+
121+
for (const [key, value] of Object.entries(nodeData)) {
122+
if (Array.isArray(value)) {
123+
transformedData[key] = value.map(item => this.transform(item, context));
124+
} else if (value && typeof value === 'object') {
125+
transformedData[key] = this.transform(value, context);
126+
} else {
127+
transformedData[key] = value;
128+
}
129+
}
130+
129131
if (!('location' in transformedData)) {
130132
transformedData.location = undefined;
131133
}
@@ -136,6 +138,22 @@ export class V13ToV14Transformer extends BaseTransformer {
136138
return transformedData;
137139
}
138140

141+
Alias(nodeData: any, context?: TransformerContext): any {
142+
const transformedData: any = {};
143+
144+
for (const [key, value] of Object.entries(nodeData)) {
145+
if (Array.isArray(value)) {
146+
transformedData[key] = value.map(item => this.transform(item, context));
147+
} else if (value && typeof value === 'object') {
148+
transformedData[key] = this.transform(value, context);
149+
} else {
150+
transformedData[key] = value;
151+
}
152+
}
153+
154+
return transformedData;
155+
}
156+
139157
protected transformDefault(node: any, nodeType: string, nodeData: any, context?: TransformerContext): any {
140158
const result = super.transformDefault(node, nodeType, nodeData, context);
141159
const transformedData = result[nodeType];
@@ -145,8 +163,9 @@ export class V13ToV14Transformer extends BaseTransformer {
145163
delete transformedData.relkind;
146164
}
147165

148-
if (transformedData && typeof transformedData === 'object') {
149-
this.ensureTypeNameFields(transformedData);
166+
if (nodeType === 'CreateTableAsStmt' && transformedData && 'relkind' in transformedData) {
167+
transformedData.objtype = transformedData.relkind;
168+
delete transformedData.relkind;
150169
}
151170

152171
return { [nodeType]: transformedData };

packages/transform/src/visitors/base.ts

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,13 @@ export abstract class BaseTransformer implements TransformerVisitor {
4747
if (Array.isArray(value)) {
4848
result[key] = value.map(item => this.transform(item, context));
4949
} else if (value && typeof value === 'object') {
50-
result[key] = this.transform(value, context);
50+
if (key === 'typeName') {
51+
const wrappedTypeName = { TypeName: value };
52+
const transformedTypeName = this.transform(wrappedTypeName, context);
53+
result[key] = transformedTypeName.TypeName;
54+
} else {
55+
result[key] = this.transform(value, context);
56+
}
5157
} else {
5258
result[key] = value;
5359
}
@@ -62,9 +68,6 @@ export abstract class BaseTransformer implements TransformerVisitor {
6268
if (!nodeData || typeof nodeData !== 'object') return;
6369

6470
if (nodeType === 'RangeVar') {
65-
if (!('location' in nodeData)) {
66-
nodeData.location = undefined;
67-
}
6871
if (!('relpersistence' in nodeData)) {
6972
nodeData.relpersistence = 'p';
7073
}
@@ -74,18 +77,12 @@ export abstract class BaseTransformer implements TransformerVisitor {
7477
}
7578

7679
if (nodeType === 'TypeName') {
77-
if (!('location' in nodeData)) {
78-
nodeData.location = undefined;
79-
}
8080
if (!('typemod' in nodeData)) {
8181
nodeData.typemod = -1;
8282
}
8383
}
8484

8585
if (nodeData.relation && typeof nodeData.relation === 'object') {
86-
if (!('location' in nodeData.relation)) {
87-
nodeData.relation.location = undefined;
88-
}
8986
if (!('relpersistence' in nodeData.relation)) {
9087
nodeData.relation.relpersistence = 'p';
9188
}
@@ -95,9 +92,6 @@ export abstract class BaseTransformer implements TransformerVisitor {
9592
}
9693

9794
if (nodeData.typeName && typeof nodeData.typeName === 'object') {
98-
if (!('location' in nodeData.typeName)) {
99-
nodeData.typeName.location = undefined;
100-
}
10195
if (!('typemod' in nodeData.typeName)) {
10296
nodeData.typeName.typemod = -1;
10397
}
@@ -115,9 +109,6 @@ export abstract class BaseTransformer implements TransformerVisitor {
115109
}
116110

117111
if (obj.typeName && typeof obj.typeName === 'object') {
118-
if (!('location' in obj.typeName)) {
119-
obj.typeName.location = undefined;
120-
}
121112
if (!('typemod' in obj.typeName)) {
122113
obj.typeName.typemod = -1;
123114
}

0 commit comments

Comments
 (0)