Skip to content

Commit 3d86f39

Browse files
committed
types
1 parent 63fd7f1 commit 3d86f39

File tree

5 files changed

+48
-17
lines changed

5 files changed

+48
-17
lines changed

__fixtures__/transform/generation-summary.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"generated": "2025-06-24T09:08:18.532Z",
2+
"generated": "2025-06-25T03:21:32.829Z",
33
"versions": [
44
13,
55
14,

packages/transform/AST_PLAN.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ We have implemented a series of AST transformers that can upgrade ASTs sequentia
1616

1717
The approach will be functional and composable, allowing us to chain transformations to go from any older version to version 17.
1818

19-
## Phase 1: Generate Example ASTs (Current Task)
19+
## Phase 1: Generate Example ASTs ✅ COMPLETED
2020

2121
### Directory Structure
2222
```
@@ -54,6 +54,20 @@ We'll use these SQL queries to generate ASTs for each version:
5454
7. **alter_table.json**: `ALTER TABLE users ADD COLUMN email TEXT`
5555
8. **complex_query.json**: A more complex query with CTEs, window functions, etc.
5656

57+
### Generated Fixtures
58+
59+
The AST fixtures have been successfully generated in `__fixtures__/transform/` with the following structure:
60+
61+
- Each version (13-17) has its own directory
62+
- Each directory contains 8 JSON files with ASTs for the test queries
63+
- The script used: `packages/transform/scripts/generate-ast-fixtures.js`
64+
- Generation summary available at: `__fixtures__/transform/generation-summary.json`
65+
66+
These fixtures now serve as the foundation for:
67+
1. Understanding AST differences between versions
68+
2. Testing our transformation logic
69+
3. Validating that transformations preserve semantic meaning
70+
5771
## Phase 2: Implement Core Transformation Infrastructure
5872

5973
### Base Types and Interfaces
@@ -153,7 +167,7 @@ Key changes:
153167

154168
## Implementation Order
155169

156-
1. **Step 0** (Current): Generate example ASTs for testing
170+
1. **Step 0** ✅ COMPLETED: Generate example ASTs for testing
157171
2. **Step 1**: Build core infrastructure and base types
158172
3. **Step 2**: Implement 14→15 transformer (most critical due to enum format change)
159173
4. **Step 3**: Implement 13→14 transformer

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { BaseTransformer, TransformerContext } from '../visitors/base';
2-
import { Node as PG14Node } from '../14/types';
3-
import { Node as PG15Node } from '../15/types';
2+
import * as PG14 from '../14/types';
3+
import * as PG15 from '../15/types';
4+
5+
// Note: We use 'any' for some node types because the generated types don't accurately
6+
// reflect the actual parser output. For example, A_Const.val is typed as generic 'Node'
7+
// but actually contains specific node types like String, Integer, Float, etc.
48

59
export class V14ToV15Transformer extends BaseTransformer {
610
transform(node: any, context?: TransformerContext): any {
@@ -23,6 +27,7 @@ export class V14ToV15Transformer extends BaseTransformer {
2327
}
2428

2529
A_Const(nodeData: any, context?: TransformerContext): any {
30+
// Using 'any' because PG14.A_Const.val is typed as generic Node but contains specific types
2631
const transformedData: any = { ...nodeData };
2732

2833
if (nodeData.val) {
@@ -64,6 +69,7 @@ export class V14ToV15Transformer extends BaseTransformer {
6469
}
6570

6671
String(node: any, context?: TransformerContext): any {
72+
// String node transformation: str -> sval
6773
const transformedData = { ...node };
6874

6975
if ('str' in transformedData) {
@@ -75,6 +81,7 @@ export class V14ToV15Transformer extends BaseTransformer {
7581
}
7682

7783
BitString(node: any, context?: TransformerContext): any {
84+
// BitString node transformation: str -> bsval
7885
const transformedData = { ...node };
7986

8087
if ('str' in transformedData) {
@@ -86,6 +93,7 @@ export class V14ToV15Transformer extends BaseTransformer {
8693
}
8794

8895
Float(node: any, context?: TransformerContext): any {
96+
// Float node transformation: str -> fval
8997
const transformedData = { ...node };
9098

9199
if ('str' in transformedData) {
@@ -97,6 +105,7 @@ export class V14ToV15Transformer extends BaseTransformer {
97105
}
98106

99107
AlterPublicationStmt(node: any, context?: TransformerContext): any {
108+
// AlterPublicationStmt: tables -> pubobjects, tableAction -> action
100109
const transformedData = { ...node };
101110

102111
if ('tables' in transformedData) {
@@ -112,6 +121,7 @@ export class V14ToV15Transformer extends BaseTransformer {
112121
}
113122

114123
CreatePublicationStmt(node: any, context?: TransformerContext): any {
124+
// CreatePublicationStmt: transform tables array to pubobjects with PublicationObjSpec
115125
const transformedData = { ...node };
116126

117127
if ('tables' in transformedData && Array.isArray(transformedData.tables)) {
@@ -141,7 +151,7 @@ export class V14ToV15Transformer extends BaseTransformer {
141151
return transformedData;
142152
}
143153

144-
FuncCall(node: any, context?: TransformerContext): any {
154+
FuncCall(node: PG14.FuncCall, context?: TransformerContext): any {
145155
const transformedData = { ...node };
146156

147157
if (!('funcformat' in transformedData)) {
@@ -181,7 +191,7 @@ export class V14ToV15Transformer extends BaseTransformer {
181191
return transformedData;
182192
}
183193

184-
ColumnRef(node: any, context?: TransformerContext): any {
194+
ColumnRef(node: PG14.ColumnRef, context?: TransformerContext): any {
185195
const transformedData = { ...node };
186196

187197
if (transformedData.fields && Array.isArray(transformedData.fields)) {
@@ -191,7 +201,7 @@ export class V14ToV15Transformer extends BaseTransformer {
191201
return transformedData;
192202
}
193203

194-
WindowDef(node: any, context?: TransformerContext): any {
204+
WindowDef(node: PG14.WindowDef, context?: TransformerContext): any {
195205
const transformedData = { ...node };
196206

197207
if (!('frameOptions' in transformedData)) {
@@ -213,6 +223,7 @@ export class V14ToV15Transformer extends BaseTransformer {
213223
}
214224

215225
SelectStmt(nodeData: any, context?: TransformerContext): any {
226+
// SelectStmt: handle limitOption and op defaults, orderClause -> sortClause in some contexts
216227
const transformedData: any = {};
217228

218229
for (const [key, value] of Object.entries(nodeData)) {
@@ -289,7 +300,7 @@ export class V14ToV15Transformer extends BaseTransformer {
289300

290301

291302

292-
Integer(node: any, context?: TransformerContext): any {
303+
Integer(node: PG14.Integer, context?: TransformerContext): any {
293304
const transformedData = { ...node };
294305

295306
if (!('ival' in transformedData)) {
@@ -300,6 +311,7 @@ export class V14ToV15Transformer extends BaseTransformer {
300311
}
301312

302313
DefElem(node: any, context?: TransformerContext): any {
314+
// DefElem: convert Integer(0/1) to Boolean for 'strict' and 'cycle' definitions
303315
const transformedData = { ...node };
304316

305317
if (transformedData.arg && transformedData.arg.Integer && (transformedData.defname === 'strict' || transformedData.defname === 'cycle')) {
@@ -326,7 +338,7 @@ export class V14ToV15Transformer extends BaseTransformer {
326338
return transformedData;
327339
}
328340

329-
RangeVar(node: any, context?: TransformerContext): any {
341+
RangeVar(node: PG14.RangeVar, context?: TransformerContext): any {
330342
return node;
331343
}
332344
}

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { BaseTransformer, TransformerContext } from '../visitors/base';
2-
import { Node as PG15Node } from '../15/types';
3-
import { Node as PG16Node } from '../16/types';
2+
import * as PG15 from '../15/types';
3+
import * as PG16 from '../16/types';
4+
5+
// Note: We use 'any' for some node types because the generated types don't accurately
6+
// reflect the actual parser output structure, particularly for fields that exist in
7+
// the parser output but not in the generated types.
48

59
export class V15ToV16Transformer extends BaseTransformer {
610
transform(node: any, context?: TransformerContext): any {
@@ -25,6 +29,7 @@ export class V15ToV16Transformer extends BaseTransformer {
2529

2630

2731
SelectStmt(nodeData: any, context?: TransformerContext): any {
32+
// SelectStmt: handle limitOption and op defaults
2833
const transformedData: any = {};
2934

3035
for (const [key, value] of Object.entries(nodeData)) {
@@ -93,15 +98,15 @@ export class V15ToV16Transformer extends BaseTransformer {
9398

9499

95100

96-
Var(node: any, context?: TransformerContext): any {
101+
Var(node: PG15.Var, context?: TransformerContext): any {
97102
return node;
98103
}
99104

100-
Aggref(node: any, context?: TransformerContext): any {
105+
Aggref(node: PG15.Aggref, context?: TransformerContext): any {
101106
return node;
102107
}
103108

104-
Integer(node: any, context?: TransformerContext): any {
109+
Integer(node: PG15.Integer, context?: TransformerContext): any {
105110
const transformedData = { ...node };
106111

107112
if (!('ival' in transformedData)) {

packages/transform/src/transformers/v16-to-v17.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { BaseTransformer, TransformerContext } from '../visitors/base';
2-
import { Node as PG16Node } from '../16/types';
3-
import { Node as PG17Node } from '../17/types';
2+
import * as PG16 from '../16/types';
3+
import * as PG17 from '../17/types';
44

55
export class V16ToV17Transformer extends BaseTransformer {
66
transform(node: any, context?: TransformerContext): any {

0 commit comments

Comments
 (0)