Skip to content

Commit 009d51a

Browse files
authored
Merge pull request #192 from launchql/ast-transformer
Ast transformer
2 parents c7fd28e + 3289a87 commit 009d51a

File tree

1,156 files changed

+194991
-5243
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,156 files changed

+194991
-5243
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
SELECT json_object('{}');
2+
3+
SELECT * FROM generate_series(1, 5);
4+
5+
SELECT get_byte(E'\\xDEADBEEF'::bytea, 1);
6+
7+
SELECT now();
8+
9+
SELECT clock_timestamp();
10+
11+
SELECT to_char(now(), 'YYYY-MM-DD HH24:MI:SS');
12+
13+
SELECT json_build_object('name', 'Alice', 'age', 30);
14+
15+
SELECT pg_typeof(42), pg_typeof('hello'), pg_typeof(now());
16+
17+
SELECT substring('abcdefg' FROM 2 FOR 3);
18+
19+
SELECT replace('hello world', 'l', 'L');
20+
21+
SELECT length('yolo');
22+
23+
SELECT position('G' IN 'ChatGPT');
24+
25+
SELECT trim(' padded text '); -- 'padded text'
26+
27+
SELECT ltrim('---abc', '-'); -- 'abc'
28+
29+
SELECT array_agg(id) FROM (VALUES (1), (2), (3)) AS t(id);
30+
31+
SELECT string_agg(name, ', ') FROM (VALUES ('Alice'), ('Bob'), ('Carol')) AS t(name);
32+
33+
SELECT json_agg(name) FROM (VALUES ('A'), ('B')) AS t(name);

__fixtures__/proto/13-latest.proto

Lines changed: 1783 additions & 2133 deletions
Large diffs are not rendered by default.

config/versions.json

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"versions": {
3+
"13": {
4+
"libpg-query": "13.5.7",
5+
"pgsql-parser": "13.18.0",
6+
"pgsql-deparser": "13.17.0",
7+
"@pgsql/types": "13.11.1",
8+
"npmTag": "pg13"
9+
},
10+
"14": {
11+
"libpg-query": "14.2.5",
12+
"pgsql-parser": "14.0.1",
13+
"pgsql-deparser": "14.0.1",
14+
"@pgsql/types": "14.1.1",
15+
"npmTag": "pg14"
16+
},
17+
"15": {
18+
"libpg-query": "15.4.8",
19+
"pgsql-parser": "15.0.0",
20+
"pgsql-deparser": "15.0.0",
21+
"@pgsql/types": "15.1.1",
22+
"npmTag": "pg15"
23+
},
24+
"16": {
25+
"libpg-query": "16.5.5",
26+
"pgsql-parser": "16.0.0",
27+
"pgsql-deparser": "16.0.0",
28+
"@pgsql/types": "16.1.1",
29+
"npmTag": "pg16"
30+
},
31+
"17": {
32+
"libpg-query": "17.5.5",
33+
"pgsql-parser": "17.7.5",
34+
"pgsql-deparser": "17.8.3",
35+
"@pgsql/types": "17.6.1",
36+
"npmTag": "pg17"
37+
}
38+
}
39+
}

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
"build:dev": "lerna run build:dev --stream; yarn symlink",
2121
"lint": "lerna run lint --parallel",
2222
"symlink": "symlink-workspace --logLevel error",
23-
"postinstall": "yarn symlink"
23+
"postinstall": "yarn symlink",
24+
"bump-versions": "ts-node scripts/bump-versions.ts"
2425
},
2526
"devDependencies": {
2627
"@types/jest": "^29.5.11",
@@ -39,6 +40,7 @@
3940
"prettier": "^3.0.2",
4041
"rimraf": "4.4.1",
4142
"strip-ansi": "^6",
43+
"semver": "^7.7.2",
4244
"symlink-workspace": "^1.10.0",
4345
"ts-jest": "^29.1.1",
4446
"ts-node": "^10.9.2",

packages/deparser/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
__tests__/__snapshots__/kitchen-sink.test.ts.snap
2+
3+
versions/

packages/deparser/README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,23 @@ console.log(deparse(stmt));
6969
// Output: SELECT * FROM another_table
7070
```
7171

72+
### Latest Version (PostgreSQL 17)
73+
74+
```sh
75+
npm install pgsql-deparser
76+
```
77+
78+
### Version-Specific Packages (PostgreSQL 13-16)
79+
80+
While we highly recommend using PG17, for PostgreSQL versions 13-16, use the version-specific packages:
81+
82+
```sh
83+
npm install pgsql-deparser@v13 # PostgreSQL 13
84+
npm install pgsql-deparser@v14 # PostgreSQL 14
85+
npm install pgsql-deparser@v15 # PostgreSQL 15
86+
npm install pgsql-deparser@v16 # PostgreSQL 16
87+
```
88+
7289
## Options
7390

7491
The deparser accepts optional configuration for formatting and output control:
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"packageName": "pgsql-deparser",
3+
"packageTemplate": {
4+
"author": "Dan Lynch <[email protected]>",
5+
"homepage": "https://github.com/launchql/pgsql-parser",
6+
"license": "MIT",
7+
"main": "index.js",
8+
"module": "esm/index.js",
9+
"types": "index.d.ts",
10+
"description": "PostgreSQL AST Deparser",
11+
"scripts": {
12+
"copy": "copyfiles -f ../../../../LICENSE README.md package.json dist",
13+
"clean": "rimraf dist",
14+
"build": "npm run clean && tsc && tsc -p tsconfig.esm.json && npm run copy",
15+
"publish:pkg": "npm publish --tag {{VERSION_TAG}}"
16+
},
17+
"publishConfig": {
18+
"access": "public",
19+
"directory": "dist"
20+
},
21+
"repository": {
22+
"type": "git",
23+
"url": "https://github.com/launchql/pgsql-parser"
24+
},
25+
"bugs": {
26+
"url": "https://github.com/launchql/pgsql-parser/issues"
27+
},
28+
"keywords": [
29+
"sql",
30+
"postgres",
31+
"postgresql",
32+
"pg",
33+
"query",
34+
"ast",
35+
"deparser",
36+
"database"
37+
]
38+
}
39+
}

packages/deparser/package.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,14 @@
3333
"fixtures:upstream-diff": "ts-node scripts/make-upstream-diff.ts",
3434
"lint": "eslint . --fix",
3535
"test": "jest",
36-
"test:watch": "jest --watch"
36+
"test:watch": "jest --watch",
37+
"strip-transformer-types": "ts-node scripts/strip-transformer-types.ts",
38+
"strip-direct-transformer-types": "ts-node scripts/strip-direct-transformer-types.ts",
39+
"strip-deparser-types": "ts-node scripts/strip-deparser-types.ts",
40+
"organize-transformers": "ts-node scripts/organize-transformers-by-version.ts",
41+
"generate-version-deparsers": "ts-node scripts/generate-version-deparsers.ts",
42+
"generate-packages": "ts-node scripts/generate-version-packages.ts",
43+
"prepare-versions": "npm run strip-transformer-types && npm run strip-direct-transformer-types && npm run strip-deparser-types && npm run organize-transformers && npm run generate-version-deparsers && npm run generate-packages"
3744
},
3845
"keywords": [
3946
"sql",
File renamed without changes.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import * as fs from 'fs';
2+
import * as path from 'path';
3+
4+
/**
5+
* Script to generate deparser index files for each version
6+
* Creates index.ts files that use transformers to provide deparse functionality
7+
*/
8+
9+
interface VersionConfig {
10+
version: number;
11+
directTransformerClass: string;
12+
directTransformerFile: string;
13+
}
14+
15+
const VERSIONS_DIR = 'versions';
16+
17+
const versionConfigs: VersionConfig[] = [
18+
{
19+
version: 13,
20+
directTransformerClass: 'PG13ToPG17Transformer',
21+
directTransformerFile: './v13-to-v17-direct'
22+
},
23+
{
24+
version: 14,
25+
directTransformerClass: 'PG14ToPG17Transformer',
26+
directTransformerFile: './v14-to-v17-direct'
27+
},
28+
{
29+
version: 15,
30+
directTransformerClass: 'PG15ToPG17Transformer',
31+
directTransformerFile: './v15-to-v17-direct'
32+
},
33+
{
34+
version: 16,
35+
directTransformerClass: 'PG16ToPG17Transformer',
36+
directTransformerFile: './v16-to-v17-direct'
37+
}
38+
];
39+
40+
function generateDeparserIndex(config: VersionConfig): string {
41+
return `/**
42+
* Deparser for PostgreSQL version ${config.version}
43+
* Auto-generated by generate-version-deparsers.ts
44+
*/
45+
46+
import { Node, ParseResult } from '@pgsql/types';
47+
import {
48+
deparse as deparse17,
49+
deparseSync as deparseSync17,
50+
DeparserOptions
51+
} from './deparser';
52+
import { ${config.directTransformerClass} } from '${config.directTransformerFile}';
53+
54+
const tx = new ${config.directTransformerClass}();
55+
56+
export async function deparse(query: Node | Node[] | ParseResult, opts?: DeparserOptions): Promise<string> {
57+
const ast17 = tx.transform(query);
58+
return await deparse17(ast17, opts);
59+
}
60+
61+
export function deparseSync(query: Node | Node[] | ParseResult, opts?: DeparserOptions): string {
62+
const ast17 = tx.transform(query);
63+
return deparseSync17(ast17, opts);
64+
}
65+
66+
// Re-export DeparserOptions for convenience
67+
export { DeparserOptions } from './deparser';
68+
`;
69+
}
70+
71+
function updateVersionDirectory(config: VersionConfig): void {
72+
const versionDir = path.join(VERSIONS_DIR, config.version.toString());
73+
74+
if (!fs.existsSync(versionDir)) {
75+
console.error(`Version directory ${versionDir} does not exist!`);
76+
return;
77+
}
78+
79+
// Create src directory if it doesn't exist
80+
const srcDir = path.join(versionDir, 'src');
81+
if (!fs.existsSync(srcDir)) {
82+
fs.mkdirSync(srcDir, { recursive: true });
83+
}
84+
85+
// Remove old index.js if it exists
86+
const oldIndexPath = path.join(srcDir, 'index.js');
87+
if (fs.existsSync(oldIndexPath)) {
88+
fs.unlinkSync(oldIndexPath);
89+
console.log(` ✓ Removed old index.js`);
90+
}
91+
92+
// Generate new index.ts in src directory
93+
const indexContent = generateDeparserIndex(config);
94+
const indexPath = path.join(srcDir, 'index.ts');
95+
fs.writeFileSync(indexPath, indexContent);
96+
console.log(` ✓ Created index.ts with deparser functionality`);
97+
}
98+
99+
100+
101+
function main(): void {
102+
console.log('Generating version-specific deparsers...\n');
103+
104+
for (const config of versionConfigs) {
105+
console.log(`Processing version ${config.version}...`);
106+
updateVersionDirectory(config);
107+
108+
console.log('');
109+
}
110+
111+
console.log('Done! Version-specific deparsers have been generated.');
112+
}
113+
114+
// Run the script
115+
main();

0 commit comments

Comments
 (0)