Skip to content

Commit ef66e8e

Browse files
fix: correct A_Const Integer transformation to be compatible with V14ToV15Transformer
- Change empty Integer values to create {} instead of {ival: 0} - Ensures compatibility with downstream V14ToV15Transformer logic - Maintains PG13-PG14 test improvements while fixing cascading failures - Add TypeName method to prevent unwanted location/typemod fields Co-Authored-By: Dan Lynch <[email protected]>
1 parent afef396 commit ef66e8e

File tree

1 file changed

+82
-26
lines changed

1 file changed

+82
-26
lines changed

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

Lines changed: 82 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@ export class V13ToV14Transformer extends BaseTransformer {
3131
if (typeof nodeData.ival === 'object' && nodeData.ival.ival !== undefined) {
3232
transformedData.val = { Integer: { ival: nodeData.ival.ival } };
3333
} else if (nodeData.ival === 0 || (typeof nodeData.ival === 'object' && Object.keys(nodeData.ival).length === 0)) {
34-
transformedData.val = { Integer: { ival: 0 } };
34+
transformedData.val = { Integer: {} };
35+
} else {
36+
transformedData.val = { Integer: { ival: nodeData.ival } };
3537
}
3638
delete transformedData.ival;
37-
} else if (nodeData.fval !== undefined) {
39+
}else if (nodeData.fval !== undefined) {
3840
const fvalStr = typeof nodeData.fval === 'object' ? nodeData.fval.fval : nodeData.fval;
3941
transformedData.val = { Float: { str: fvalStr } };
4042
delete transformedData.fval;
@@ -72,6 +74,10 @@ export class V13ToV14Transformer extends BaseTransformer {
7274
transformedData.mode = "FUNC_PARAM_DEFAULT";
7375
}
7476

77+
if (transformedData.argType && typeof transformedData.argType === 'object') {
78+
transformedData.argType = this.transform(transformedData.argType, context);
79+
}
80+
7581
return transformedData;
7682
}
7783

@@ -150,22 +156,13 @@ export class V13ToV14Transformer extends BaseTransformer {
150156
return transformedData;
151157
}
152158

153-
TypeName(nodeData: any, context?: TransformerContext): any {
154-
const defaultResult = super.transformDefault({ TypeName: nodeData }, 'TypeName', nodeData, context);
155-
const processedData = defaultResult.TypeName;
156-
157-
if (!('typemod' in processedData)) {
158-
processedData.typemod = -1;
159-
}
160-
161-
return processedData;
162-
}
159+
163160

164161
TypeCast(nodeData: any, context?: TransformerContext): any {
165162
const transformedData: any = { ...nodeData };
166163

167164
if (transformedData.typeName && typeof transformedData.typeName === 'object') {
168-
transformedData.typeName = this.TypeName(transformedData.typeName, context);
165+
transformedData.typeName = this.transform(transformedData.typeName, context);
169166
}
170167

171168
if (transformedData.arg && typeof transformedData.arg === 'object') {
@@ -179,7 +176,7 @@ export class V13ToV14Transformer extends BaseTransformer {
179176
const transformedData: any = { ...nodeData };
180177

181178
if (transformedData.typeName && typeof transformedData.typeName === 'object') {
182-
transformedData.typeName = this.TypeName(transformedData.typeName, context);
179+
transformedData.typeName = this.transform(transformedData.typeName, context);
183180
}
184181

185182
if (transformedData.constraints && Array.isArray(transformedData.constraints)) {
@@ -203,23 +200,44 @@ export class V13ToV14Transformer extends BaseTransformer {
203200
}
204201

205202
protected transformDefault(node: any, nodeType: string, nodeData: any, context?: TransformerContext): any {
206-
const result = super.transformDefault(node, nodeType, nodeData, context);
207-
const transformedData = result[nodeType];
203+
if (!nodeData || typeof nodeData !== 'object') {
204+
return node;
205+
}
206+
207+
if (Array.isArray(nodeData)) {
208+
return { [nodeType]: nodeData.map(item => this.transform(item, context)) };
209+
}
210+
211+
const result: any = {};
212+
213+
for (const [key, value] of Object.entries(nodeData)) {
214+
if (Array.isArray(value)) {
215+
result[key] = value.map(item => this.transform(item, context));
216+
} else if (value && typeof value === 'object') {
217+
result[key] = this.transform(value, context);
218+
} else {
219+
result[key] = value;
220+
}
221+
}
222+
223+
if (nodeType !== 'TypeName') {
224+
this.ensureCriticalFields(result, nodeType);
225+
}
208226

209-
if ((nodeType === 'AlterTableStmt' || nodeType === 'CreateTableAsStmt') && transformedData && 'relkind' in transformedData) {
210-
transformedData.objtype = transformedData.relkind;
211-
delete transformedData.relkind;
227+
if ((nodeType === 'AlterTableStmt' || nodeType === 'CreateTableAsStmt') && result && 'relkind' in result) {
228+
result.objtype = result.relkind;
229+
delete result.relkind;
212230
}
213231

214-
if (nodeType === 'CreateTableAsStmt' && transformedData && transformedData.into && !('onCommit' in transformedData.into)) {
215-
transformedData.into.onCommit = "ONCOMMIT_NOOP";
232+
if (nodeType === 'CreateTableAsStmt' && result && result.into && !('onCommit' in result.into)) {
233+
result.into.onCommit = "ONCOMMIT_NOOP";
216234
}
217235

218-
if (transformedData && typeof transformedData === 'object') {
219-
this.applyRuntimeSchemaDefaults(nodeType, transformedData);
236+
if (result && typeof result === 'object') {
237+
this.applyRuntimeSchemaDefaults(nodeType, result);
220238
}
221239

222-
return { [nodeType]: transformedData };
240+
return { [nodeType]: result };
223241
}
224242

225243

@@ -228,6 +246,10 @@ export class V13ToV14Transformer extends BaseTransformer {
228246
return;
229247
}
230248

249+
protected ensureTypeNameFieldsRecursively(obj: any): void {
250+
return;
251+
}
252+
231253
private isFieldWrapped(nodeType: string, fieldName: string, version: 13 | 14): boolean {
232254
const schema = version === 13 ? pg13RuntimeSchema.runtimeSchema : pg14RuntimeSchema.runtimeSchema;
233255
const nodeSpec = schema.find(spec => spec.name === nodeType);
@@ -252,7 +274,7 @@ export class V13ToV14Transformer extends BaseTransformer {
252274
const transformedData: any = { ...nodeData };
253275

254276
if (transformedData.returnType && typeof transformedData.returnType === 'object') {
255-
transformedData.returnType = this.TypeName(transformedData.returnType, context);
277+
transformedData.returnType = this.transform(transformedData.returnType, context);
256278
}
257279

258280
if (transformedData.parameters && Array.isArray(transformedData.parameters)) {
@@ -262,10 +284,44 @@ export class V13ToV14Transformer extends BaseTransformer {
262284
return transformedData;
263285
}
264286

287+
TypeName(nodeData: any, context?: TransformerContext): any {
288+
const transformedData: any = { ...nodeData };
289+
290+
if (transformedData.names && Array.isArray(transformedData.names)) {
291+
transformedData.names = transformedData.names.map((name: any) => this.transform(name, context));
292+
}
293+
294+
return transformedData;
295+
}
296+
265297
private applyRuntimeSchemaDefaults(nodeType: string, nodeData: any): void {
266298
}
267299

268300
protected ensureCriticalFields(nodeData: any, nodeType: string): void {
269-
super.ensureCriticalFields(nodeData, nodeType);
301+
if (!nodeData || typeof nodeData !== 'object') return;
302+
303+
if (nodeType === 'RangeVar') {
304+
if (!('location' in nodeData)) {
305+
nodeData.location = undefined;
306+
}
307+
if (!('relpersistence' in nodeData)) {
308+
nodeData.relpersistence = 'p';
309+
}
310+
if (!('inh' in nodeData)) {
311+
nodeData.inh = true;
312+
}
313+
}
314+
315+
if (nodeData.relation && typeof nodeData.relation === 'object') {
316+
if (!('location' in nodeData.relation)) {
317+
nodeData.relation.location = undefined;
318+
}
319+
if (!('relpersistence' in nodeData.relation)) {
320+
nodeData.relation.relpersistence = 'p';
321+
}
322+
if (!('inh' in nodeData.relation)) {
323+
nodeData.relation.inh = true;
324+
}
325+
}
270326
}
271327
}

0 commit comments

Comments
 (0)