Skip to content

Commit 848780f

Browse files
fix: invert shouldPreserveObjnameAsObject logic to convert objects to arrays in CreateOpClassItem contexts
Co-Authored-By: Dan Lynch <[email protected]>
1 parent 3cdab33 commit 848780f

File tree

1 file changed

+51
-13
lines changed

1 file changed

+51
-13
lines changed

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

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -88,25 +88,26 @@ export class V13ToV14Transformer {
8888
if (key === 'ctes' && Array.isArray(value)) {
8989
transformedData[key] = value.map(item => this.transform(item as any, context));
9090
} else if (key === 'objname' && typeof value === 'object' && value !== null) {
91-
console.log('transformGenericNode: Processing objname:', {
92-
isArray: Array.isArray(value),
93-
value: JSON.stringify(value, null, 2),
94-
keys: Object.keys(value)
95-
});
9691
if (Array.isArray(value)) {
97-
console.log('transformGenericNode: objname is array, transforming items');
9892
transformedData[key] = value.map(item => this.transform(item as any, context));
9993
} else {
10094
const keys = Object.keys(value);
10195
const isNumericKeysObject = keys.every(k => /^\d+$/.test(k));
102-
console.log('transformGenericNode: objname is object, isNumericKeysObject:', isNumericKeysObject, 'keys:', keys);
96+
10397
if (isNumericKeysObject && keys.length > 0) {
104-
const sortedKeys = keys.sort((a, b) => parseInt(a) - parseInt(b));
105-
console.log('transformGenericNode: Converting numeric keys object to array, sortedKeys:', sortedKeys);
106-
transformedData[key] = sortedKeys.map(k => this.transform((value as any)[k], context));
98+
const shouldPreserve = this.shouldPreserveObjnameAsObject(context);
99+
if (shouldPreserve) {
100+
const transformedObjname: any = {};
101+
Object.keys(value).forEach(k => {
102+
transformedObjname[k] = this.transform((value as any)[k], context);
103+
});
104+
transformedData[key] = transformedObjname;
105+
} else {
106+
const sortedKeys = keys.sort((a, b) => parseInt(a) - parseInt(b));
107+
transformedData[key] = sortedKeys.map(k => this.transform((value as any)[k], context));
108+
}
107109
} else {
108110
// Regular object transformation
109-
console.log('transformGenericNode: Regular object transformation for objname');
110111
transformedData[key] = this.transform(value as any, context);
111112
}
112113
}
@@ -1666,8 +1667,26 @@ export class V13ToV14Transformer {
16661667
if (Array.isArray(result.objname)) {
16671668
result.objname = result.objname.map((item: any) => this.transform(item, context));
16681669
} else if (typeof result.objname === 'object' && result.objname !== null) {
1669-
const keys = Object.keys(result.objname).sort((a, b) => parseInt(a) - parseInt(b));
1670-
result.objname = keys.map(key => this.transform(result.objname[key], context));
1670+
const keys = Object.keys(result.objname);
1671+
const isNumericKeysObject = keys.every(k => /^\d+$/.test(k));
1672+
1673+
if (isNumericKeysObject && keys.length > 0) {
1674+
// Check if we should preserve objname as object with numeric keys
1675+
const shouldPreserve = this.shouldPreserveObjnameAsObject(context);
1676+
if (shouldPreserve) {
1677+
const transformedObjname: any = {};
1678+
Object.keys(result.objname).forEach(k => {
1679+
transformedObjname[k] = this.transform(result.objname[k], context);
1680+
});
1681+
result.objname = transformedObjname;
1682+
} else {
1683+
const sortedKeys = keys.sort((a, b) => parseInt(a) - parseInt(b));
1684+
result.objname = sortedKeys.map(key => this.transform(result.objname[key], context));
1685+
}
1686+
} else {
1687+
// Regular object transformation
1688+
result.objname = this.transform(result.objname, context);
1689+
}
16711690
} else {
16721691
result.objname = this.transform(result.objname, context);
16731692
}
@@ -1862,6 +1881,25 @@ export class V13ToV14Transformer {
18621881
return false;
18631882
}
18641883

1884+
private shouldPreserveObjnameAsObject(context: TransformerContext): boolean {
1885+
if (!context.parentNodeTypes || context.parentNodeTypes.length === 0) {
1886+
return true; // Default to preserving objects
1887+
}
1888+
1889+
// For CreateOpClassItem contexts, convert objname to arrays (PG14 expects arrays)
1890+
const convertToArrayContexts = [
1891+
'CreateOpClassStmt', 'CreateOpClassItem', 'CreateAccessMethodStmt'
1892+
];
1893+
1894+
for (const parentType of context.parentNodeTypes) {
1895+
if (convertToArrayContexts.includes(parentType)) {
1896+
return false; // Convert to array for these contexts
1897+
}
1898+
}
1899+
1900+
return true; // Preserve as object for other contexts
1901+
}
1902+
18651903
private createFunctionParameterFromTypeName(typeNameNode: any): any {
18661904
const transformedTypeName = this.transform(typeNameNode, { parentNodeTypes: [] });
18671905

0 commit comments

Comments
 (0)