Skip to content

Commit e303999

Browse files
feat: add debug tests and improve String transformations in V14ToV15Transformer
- Added comprehensive debug tests for String method dispatch and result propagation - Fixed String transformation issues in sortClause contexts - Improved method dispatch tracing for debugging AST transformations Co-Authored-By: Dan Lynch <[email protected]>
1 parent 61c2806 commit e303999

File tree

5 files changed

+263
-0
lines changed

5 files changed

+263
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { Parser } from '@pgsql/parser';
2+
import { V14ToV15Transformer } from '../src/transformers/v14-to-v15';
3+
4+
class VerboseSortClauseTransformer extends V14ToV15Transformer {
5+
String(nodeData: any, context?: any): any {
6+
console.log(`=== String method called ===`);
7+
console.log('Input nodeData:', JSON.stringify(nodeData, null, 2));
8+
console.log('Stack trace:', new Error().stack?.split('\n').slice(1, 5).join('\n'));
9+
10+
const result = super.String(nodeData, context);
11+
12+
console.log('String method returning:', JSON.stringify(result, null, 2));
13+
return result;
14+
}
15+
16+
SortBy(nodeData: any, context?: any): any {
17+
console.log(`=== SortBy method called ===`);
18+
console.log('Input nodeData:', JSON.stringify(nodeData, null, 2));
19+
20+
const result = super.transform(nodeData, context);
21+
22+
console.log('SortBy result:', JSON.stringify(result, null, 2));
23+
return result;
24+
}
25+
}
26+
27+
describe('Debug SortClause String Transformation', () => {
28+
it('should trace String transformations in sortClause vs targetList', async () => {
29+
const sql = `SELECT guid_field FROM guid1 ORDER BY guid_field ASC`;
30+
31+
console.log('=== Testing SortClause String Transformation ===');
32+
console.log('SQL:', sql);
33+
34+
const pg14Parser = new Parser(14);
35+
const pg14Ast = await pg14Parser.parse(sql) as any;
36+
37+
console.log('\n=== Original PG14 Structure ===');
38+
const targetListString = pg14Ast.stmts[0].stmt.SelectStmt.targetList[0].ResTarget.val.ColumnRef.fields[0].String;
39+
const sortClauseString = pg14Ast.stmts[0].stmt.SelectStmt.sortClause[0].SortBy.node.ColumnRef.fields[0].String;
40+
41+
console.log('TargetList String:', JSON.stringify(targetListString, null, 2));
42+
console.log('SortClause String:', JSON.stringify(sortClauseString, null, 2));
43+
44+
console.log('\n=== Applying VerboseSortClauseTransformer ===');
45+
const transformer = new VerboseSortClauseTransformer();
46+
const transformedAst = transformer.transform(pg14Ast) as any;
47+
48+
console.log('\n=== Final Result ===');
49+
const finalTargetListString = transformedAst.stmts[0].stmt.SelectStmt.targetList[0].ResTarget.val.ColumnRef.fields[0].String;
50+
const finalSortClauseString = transformedAst.stmts[0].stmt.SelectStmt.sortClause[0].SortBy.node.ColumnRef.fields[0].String;
51+
52+
console.log('Final TargetList String:', JSON.stringify(finalTargetListString, null, 2));
53+
console.log('Final SortClause String:', JSON.stringify(finalSortClauseString, null, 2));
54+
55+
expect(true).toBe(true);
56+
});
57+
});
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { Parser } from '@pgsql/parser';
2+
import { V14ToV15Transformer } from '../src/transformers/v14-to-v15';
3+
4+
class VerboseStringTransformer extends V14ToV15Transformer {
5+
String(nodeData: any, context?: any): any {
6+
console.log(`=== V14ToV15Transformer.String method called ===`);
7+
console.log('Input nodeData:', JSON.stringify(nodeData, null, 2));
8+
9+
const result = super.String(nodeData, context);
10+
11+
console.log('String method result:', JSON.stringify(result, null, 2));
12+
return result;
13+
}
14+
15+
transform(node: any, context?: any): any {
16+
if (node && typeof node === 'object' && !Array.isArray(node)) {
17+
const keys = Object.keys(node);
18+
if (keys.length === 1) {
19+
const nodeType = keys[0];
20+
21+
if (nodeType === 'String') {
22+
console.log(`=== BaseTransformer.transform processing String ===`);
23+
console.log('Input node:', JSON.stringify(node, null, 2));
24+
console.log('nodeData:', JSON.stringify(node[nodeType], null, 2));
25+
console.log('nodeData is object:', typeof node[nodeType] === 'object');
26+
console.log('nodeData is array:', Array.isArray(node[nodeType]));
27+
console.log('String method exists:', typeof (this as any)['String'] === 'function');
28+
29+
if (node[nodeType] && typeof node[nodeType] === 'object' && !Array.isArray(node[nodeType])) {
30+
console.log('=== Conditions met, should call String method ===');
31+
} else {
32+
console.log('=== Conditions NOT met for String method call ===');
33+
}
34+
}
35+
}
36+
}
37+
38+
return super.transform(node, context);
39+
}
40+
}
41+
42+
describe('Debug String Method Dispatch', () => {
43+
it('should trace String method calls in V14ToV15Transformer', async () => {
44+
const sql = `SELECT guid_field FROM guid1 ORDER BY guid_field ASC`;
45+
46+
console.log('=== Testing String Method Dispatch ===');
47+
console.log('SQL:', sql);
48+
49+
const pg14Parser = new Parser(14);
50+
const pg14Ast = await pg14Parser.parse(sql) as any;
51+
52+
console.log('\n=== Original PG14 String Structure ===');
53+
const stringNode = pg14Ast.stmts[0].stmt.SelectStmt.sortClause[0].SortBy.node.ColumnRef.fields[0].String;
54+
console.log('String structure:', JSON.stringify(stringNode, null, 2));
55+
56+
console.log('\n=== Applying VerboseStringTransformer ===');
57+
const transformer = new VerboseStringTransformer();
58+
const transformedAst = transformer.transform(pg14Ast) as any;
59+
60+
console.log('\n=== Final Result ===');
61+
const finalString = transformedAst.stmts[0].stmt.SelectStmt.sortClause[0].SortBy.node.ColumnRef.fields[0].String;
62+
console.log('Final String structure:', JSON.stringify(finalString, null, 2));
63+
64+
expect(true).toBe(true);
65+
});
66+
});
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { Parser } from '@pgsql/parser';
2+
import { V14ToV15Transformer } from '../src/transformers/v14-to-v15';
3+
4+
class DetailedStringTransformer extends V14ToV15Transformer {
5+
String(nodeData: any, context?: any): any {
6+
console.log(`=== String method called ===`);
7+
console.log('Input nodeData:', JSON.stringify(nodeData, null, 2));
8+
9+
const result = super.String(nodeData, context);
10+
11+
console.log('String method returning:', JSON.stringify(result, null, 2));
12+
return result;
13+
}
14+
15+
transform(node: any, context?: any): any {
16+
if (node && typeof node === 'object' && !Array.isArray(node)) {
17+
const keys = Object.keys(node);
18+
if (keys.length === 1) {
19+
const nodeType = keys[0];
20+
const nodeData = node[nodeType];
21+
22+
if (nodeType === 'String') {
23+
console.log(`=== BaseTransformer processing String node ===`);
24+
console.log('Input node:', JSON.stringify(node, null, 2));
25+
26+
if (nodeData && typeof nodeData === 'object' && !Array.isArray(nodeData)) {
27+
const methodName = nodeType;
28+
29+
if (typeof (this as any)[methodName] === 'function') {
30+
console.log('=== Calling String method via dynamic dispatch ===');
31+
const transformedData = (this as any)[methodName](nodeData, context);
32+
console.log('Method returned:', JSON.stringify(transformedData, null, 2));
33+
const wrappedResult = { [nodeType]: transformedData };
34+
console.log('Wrapped result:', JSON.stringify(wrappedResult, null, 2));
35+
return wrappedResult;
36+
}
37+
}
38+
}
39+
}
40+
}
41+
42+
return super.transform(node, context);
43+
}
44+
}
45+
46+
describe('Debug String Result Propagation', () => {
47+
it('should trace exactly where String transformation gets lost', async () => {
48+
const stringNode = {
49+
String: {
50+
str: "test_value"
51+
}
52+
};
53+
54+
console.log('=== Testing String Result Propagation ===');
55+
console.log('Input String node:', JSON.stringify(stringNode, null, 2));
56+
57+
const transformer = new DetailedStringTransformer();
58+
const result = transformer.transform(stringNode);
59+
60+
console.log('\n=== Final Result ===');
61+
console.log('Final result:', JSON.stringify(result, null, 2));
62+
63+
expect(result.String.sval).toBe("test_value");
64+
expect(result.String.str).toBeUndefined();
65+
});
66+
});
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { Parser } from '@pgsql/parser';
2+
import { V14ToV15Transformer } from '../src/transformers/v14-to-v15';
3+
4+
class VerboseV14ToV15Transformer extends V14ToV15Transformer {
5+
A_Const(nodeData: any, context?: any): any {
6+
console.log(`=== V14ToV15Transformer.A_Const method called ===`);
7+
console.log('Input nodeData:', JSON.stringify(nodeData, null, 2));
8+
9+
const result = super.A_Const(nodeData, context);
10+
11+
console.log('A_Const result:', JSON.stringify(result, null, 2));
12+
return result;
13+
}
14+
15+
transform(node: any, context?: any): any {
16+
if (node && typeof node === 'object' && !Array.isArray(node)) {
17+
const keys = Object.keys(node);
18+
if (keys.length === 1) {
19+
const nodeType = keys[0];
20+
console.log(`=== BaseTransformer.transform processing ${nodeType} ===`);
21+
22+
if (nodeType === 'A_Const') {
23+
console.log('Input node:', JSON.stringify(node, null, 2));
24+
console.log('nodeData:', JSON.stringify(node[nodeType], null, 2));
25+
console.log('nodeData is object:', typeof node[nodeType] === 'object');
26+
console.log('nodeData is array:', Array.isArray(node[nodeType]));
27+
console.log('A_Const method exists:', typeof (this as any)['A_Const'] === 'function');
28+
29+
if (node[nodeType] && typeof node[nodeType] === 'object' && !Array.isArray(node[nodeType])) {
30+
console.log('=== Conditions met, should call A_Const method ===');
31+
} else {
32+
console.log('=== Conditions NOT met for A_Const method call ===');
33+
}
34+
}
35+
}
36+
}
37+
38+
return super.transform(node, context);
39+
}
40+
}
41+
42+
describe('Debug V14ToV15 A_Const Method Dispatch', () => {
43+
it('should trace A_Const method calls in V14ToV15Transformer', async () => {
44+
const sql = `INSERT INTO TIMESTAMP_TBL VALUES ('now')`;
45+
46+
console.log('=== Testing V14ToV15 A_Const Method Dispatch ===');
47+
console.log('SQL:', sql);
48+
49+
const pg14Parser = new Parser(14);
50+
const pg14Ast = await pg14Parser.parse(sql) as any;
51+
52+
console.log('\n=== Original PG14 A_Const Structure ===');
53+
const aConstNode = pg14Ast.stmts[0].stmt.InsertStmt.selectStmt.SelectStmt.valuesLists[0].List.items[0].A_Const;
54+
console.log('A_Const structure:', JSON.stringify(aConstNode, null, 2));
55+
56+
console.log('\n=== Applying VerboseV14ToV15Transformer ===');
57+
const transformer = new VerboseV14ToV15Transformer();
58+
const transformedAst = transformer.transform(pg14Ast) as any;
59+
60+
console.log('\n=== Final Result ===');
61+
const finalAConst = transformedAst.stmts[0].stmt.InsertStmt.selectStmt.SelectStmt.valuesLists[0].List.items[0].A_Const;
62+
console.log('Final A_Const structure:', JSON.stringify(finalAConst, null, 2));
63+
64+
expect(true).toBe(true);
65+
});
66+
});

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,10 +272,18 @@ export class V14ToV15Transformer extends BaseTransformer {
272272
transformedData.orderClause = transformedData.orderClause.map((item: any) => this.transform(item, context));
273273
}
274274

275+
if (transformedData.sortClause && Array.isArray(transformedData.sortClause)) {
276+
transformedData.sortClause = transformedData.sortClause.map((item: any) => this.transform(item, context));
277+
}
278+
275279
if (transformedData.limitClause && typeof transformedData.limitClause === 'object') {
276280
transformedData.limitClause = this.transform(transformedData.limitClause, context);
277281
}
278282

283+
if (transformedData.valuesLists && Array.isArray(transformedData.valuesLists)) {
284+
transformedData.valuesLists = transformedData.valuesLists.map((item: any) => this.transform(item, context));
285+
}
286+
279287
return transformedData;
280288
}
281289

0 commit comments

Comments
 (0)