diff --git a/.github/workflows/check-upstream.yml b/.github/workflows/check-upstream.yml index 0a3b9e4..befee5b 100644 --- a/.github/workflows/check-upstream.yml +++ b/.github/workflows/check-upstream.yml @@ -70,7 +70,7 @@ jobs: - name: Create pull request if: steps.ver.outputs.needs == 'true' - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@v7 with: branch: upgrade/sqlparser-${{ steps.ver.outputs.latest }} title: '⬆️ Upgrade to sqlparser v${{ steps.ver.outputs.latest }}' diff --git a/Cargo.lock b/Cargo.lock index 0fe0736..75873f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -251,9 +251,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "sqlparser" -version = "0.61.0" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf5ea8d4d7c808e1af1cbabebca9a2abe603bcefc22294c5b95018d53200cb7" +checksum = "13c6d1b651dc4edf07eead2a0c6c78016ce971bc2c10da5266861b13f25e7cec" dependencies = [ "log", "recursive", @@ -262,7 +262,7 @@ dependencies = [ [[package]] name = "sqlparser-rs-wasm" -version = "0.61.1" +version = "0.62.0" dependencies = [ "console_error_panic_hook", "serde", diff --git a/Cargo.toml b/Cargo.toml index d244fb8..0ea4df4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sqlparser-rs-wasm" -version = "0.61.1" +version = "0.62.0" edition = "2021" description = "WebAssembly bindings for sqlparser SQL parser" license = "Apache-2.0" @@ -10,7 +10,7 @@ repository = "https://github.com/guanmingchiu/sqlparser-ts" crate-type = ["cdylib", "rlib"] [dependencies] -sqlparser = { version = "0.61.0", features = ["serde"] } +sqlparser = { version = "0.62.0", features = ["serde"] } wasm-bindgen = "0.2" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/README.md b/README.md index 5f9a1ec..ae2478d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![npm downloads](https://img.shields.io/npm/dm/@guanmingchiu/sqlparser-ts.svg)](https://www.npmjs.com/package/@guanmingchiu/sqlparser-ts) [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![WebAssembly](https://img.shields.io/badge/WebAssembly-powered-blueviolet.svg)](https://webassembly.org/) -[![sqlparser](https://img.shields.io/badge/sqlparser--rs-v0.61.0-orange.svg)](https://github.com/apache/datafusion-sqlparser-rs) +[![sqlparser](https://img.shields.io/badge/sqlparser--rs-v0.62.0-orange.svg)](https://github.com/apache/datafusion-sqlparser-rs) SQL parser for JavaScript and TypeScript, powered by [datafusion-sqlparser-rs](https://github.com/apache/datafusion-sqlparser-rs) via WebAssembly. @@ -16,7 +16,7 @@ SQL parser for JavaScript and TypeScript, powered by [datafusion-sqlparser-rs](h ## Features - Parse SQL into a detailed AST with full TypeScript types -- Support 14 SQL dialects (PostgreSQL, MySQL, SQLite, BigQuery, and more) +- Support 16 SQL dialects (PostgreSQL, MySQL, SQLite, BigQuery, and more) - Run in Node.js and browsers - Stay small (~600KB gzipped) and fast (Rust + WebAssembly) - Ship zero native dependencies @@ -94,7 +94,7 @@ try { ## Supported Dialects -`generic`, `ansi`, `mysql`, `postgresql`, `sqlite`, `snowflake`, `redshift`, `mssql`, `clickhouse`, `bigquery`, `duckdb`, `databricks`, `hive`, `oracle` +`generic`, `ansi`, `mysql`, `postgresql`, `sqlite`, `snowflake`, `redshift`, `mssql`, `clickhouse`, `bigquery`, `duckdb`, `databricks`, `hive`, `oracle`, `spark`, `teradata` ## Versioning diff --git a/package.json b/package.json index 81d8d82..be34ab8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@guanmingchiu/sqlparser-ts", - "version": "0.61.1", + "version": "0.62.0", "type": "module", "description": "A SQL parser for JavaScript and TypeScript, powered by datafusion-sqlparser-rs via WASM", "main": "dist/index.cjs", diff --git a/src/dialects.ts b/src/dialects.ts index 28eadc3..cc4b62d 100644 --- a/src/dialects.ts +++ b/src/dialects.ts @@ -111,6 +111,20 @@ export class OracleDialect implements Dialect { readonly name = 'oracle'; } +/** + * Apache Spark SQL dialect + */ +export class SparkDialect implements Dialect { + readonly name = 'spark'; +} + +/** + * Teradata dialect + */ +export class TeradataDialect implements Dialect { + readonly name = 'teradata'; +} + /** * All supported dialect names */ @@ -129,6 +143,8 @@ export const SUPPORTED_DIALECTS = [ 'databricks', 'hive', 'oracle', + 'spark', + 'teradata', ] as const; export type DialectName = (typeof SUPPORTED_DIALECTS)[number]; @@ -151,6 +167,8 @@ const DIALECT_MAP: Record Dialect> = { databricks: DatabricksDialect, hive: HiveDialect, oracle: OracleDialect, + spark: SparkDialect, + teradata: TeradataDialect, }; /** Create a dialect instance from a string name (case-insensitive) */ @@ -163,6 +181,7 @@ export function dialectFromString(name: string): Dialect | undefined { pg: 'postgresql', sqlserver: 'mssql', duck: 'duckdb', + sparksql: 'spark', }; const dialectName = aliasMap[normalized] ?? normalized; diff --git a/src/index.ts b/src/index.ts index f8707d5..be0ba65 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,6 +23,8 @@ export { DatabricksDialect, HiveDialect, OracleDialect, + SparkDialect, + TeradataDialect, dialectFromString, SUPPORTED_DIALECTS, } from './dialects.js'; diff --git a/src/lib.rs b/src/lib.rs index 9f42034..c43274c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,7 +3,7 @@ use sqlparser::ast::comments::{Comment as SqlComment, CommentWithSpan}; use sqlparser::dialect::{ AnsiDialect, BigQueryDialect, ClickHouseDialect, DatabricksDialect, Dialect, DuckDbDialect, GenericDialect, HiveDialect, MsSqlDialect, MySqlDialect, OracleDialect, PostgreSqlDialect, - RedshiftSqlDialect, SQLiteDialect, SnowflakeDialect, + RedshiftSqlDialect, SQLiteDialect, SnowflakeDialect, SparkSqlDialect, TeradataDialect, }; use sqlparser::parser::Parser; use wasm_bindgen::prelude::*; @@ -48,6 +48,8 @@ fn get_dialect(dialect_name: &str) -> Box { "databricks" => Box::new(DatabricksDialect {}), "hive" => Box::new(HiveDialect {}), "oracle" => Box::new(OracleDialect {}), + "spark" | "sparksql" => Box::new(SparkSqlDialect {}), + "teradata" => Box::new(TeradataDialect {}), _ => Box::new(GenericDialect {}), } } diff --git a/tests/dialects/spark.test.ts b/tests/dialects/spark.test.ts new file mode 100644 index 0000000..de10c79 --- /dev/null +++ b/tests/dialects/spark.test.ts @@ -0,0 +1,17 @@ +/** + * Spark SQL dialect tests + */ + +import { parseOne, dialects } from '../test-utils'; + +const spark = dialects.spark; + +describe('Spark SQL', () => { + test('parse_basic_select', () => { + parseOne('SELECT a, b FROM t WHERE a > 1', spark); + }); + + test('parse_struct_type', () => { + parseOne('CREATE TABLE t (s STRUCT)', spark); + }); +}); diff --git a/tests/dialects/teradata.test.ts b/tests/dialects/teradata.test.ts new file mode 100644 index 0000000..aecd1e5 --- /dev/null +++ b/tests/dialects/teradata.test.ts @@ -0,0 +1,13 @@ +/** + * Teradata dialect tests + */ + +import { parseOne, dialects } from '../test-utils'; + +const teradata = dialects.teradata; + +describe('Teradata', () => { + test('parse_basic_select', () => { + parseOne('SELECT a, b FROM t WHERE a > 1', teradata); + }); +}); diff --git a/tests/test-utils.ts b/tests/test-utils.ts index c760cea..abd31f2 100644 --- a/tests/test-utils.ts +++ b/tests/test-utils.ts @@ -19,6 +19,8 @@ import { AnsiDialect, OracleDialect, DatabricksDialect, + SparkDialect, + TeradataDialect, type Dialect, type Statement, } from '../src'; @@ -103,6 +105,8 @@ export const dialects = { hive: new HiveDialect(), oracle: new OracleDialect(), databricks: new DatabricksDialect(), + spark: new SparkDialect(), + teradata: new TeradataDialect(), }; /**