diff --git a/src/parser/tag.rs b/src/parser/tag.rs index 50b28fb7..e6af621a 100644 --- a/src/parser/tag.rs +++ b/src/parser/tag.rs @@ -63,7 +63,11 @@ pub fn get_sql_from_expr( .iter() .map(|tpl_element| SQL { var_decl_name: var_decl_name.to_owned(), - query: tpl_element.raw.to_string(), + query: tpl_element + .cooked + .as_ref() + .map(|c| c.to_atom_lossy().to_string()) + .unwrap_or_else(|| tpl_element.raw.to_string()), span: span.clone(), }) .collect(); diff --git a/tests/demo/mysql/backtick_escaping.queries.ts b/tests/demo/mysql/backtick_escaping.queries.ts new file mode 100644 index 00000000..ed5f371c --- /dev/null +++ b/tests/demo/mysql/backtick_escaping.queries.ts @@ -0,0 +1,41 @@ +export type BacktickTableNameParams = []; + +export interface IBacktickTableNameResult { + flavor_text: string | null; + id: number; + inventory_id: number | null; + name: string; + rarity: string | null; +} + +export interface IBacktickTableNameQuery { + params: BacktickTableNameParams; + result: IBacktickTableNameResult; +} + +export type BacktickQualifiedNameParams = []; + +export interface IBacktickQualifiedNameResult { + flavor_text: string | null; + id: number; + inventory_id: number | null; + name: string; + rarity: string | null; +} + +export interface IBacktickQualifiedNameQuery { + params: BacktickQualifiedNameParams; + result: IBacktickQualifiedNameResult; +} + +export type BacktickColumnNamesParams = [number]; + +export interface IBacktickColumnNamesResult { + id: number; + name: string; +} + +export interface IBacktickColumnNamesQuery { + params: BacktickColumnNamesParams; + result: IBacktickColumnNamesResult; +} diff --git a/tests/demo/mysql/backtick_escaping.snapshot.ts b/tests/demo/mysql/backtick_escaping.snapshot.ts new file mode 100644 index 00000000..ed5f371c --- /dev/null +++ b/tests/demo/mysql/backtick_escaping.snapshot.ts @@ -0,0 +1,41 @@ +export type BacktickTableNameParams = []; + +export interface IBacktickTableNameResult { + flavor_text: string | null; + id: number; + inventory_id: number | null; + name: string; + rarity: string | null; +} + +export interface IBacktickTableNameQuery { + params: BacktickTableNameParams; + result: IBacktickTableNameResult; +} + +export type BacktickQualifiedNameParams = []; + +export interface IBacktickQualifiedNameResult { + flavor_text: string | null; + id: number; + inventory_id: number | null; + name: string; + rarity: string | null; +} + +export interface IBacktickQualifiedNameQuery { + params: BacktickQualifiedNameParams; + result: IBacktickQualifiedNameResult; +} + +export type BacktickColumnNamesParams = [number]; + +export interface IBacktickColumnNamesResult { + id: number; + name: string; +} + +export interface IBacktickColumnNamesQuery { + params: BacktickColumnNamesParams; + result: IBacktickColumnNamesResult; +} diff --git a/tests/demo/mysql/backtick_escaping.ts b/tests/demo/mysql/backtick_escaping.ts new file mode 100644 index 00000000..66d3d795 --- /dev/null +++ b/tests/demo/mysql/backtick_escaping.ts @@ -0,0 +1,22 @@ +import { sql } from 'sqlx-ts' + +// Issue #265: Backtick-escaped table names should work +const backtickTableName = sql` +-- @db: db_mysql +-- @name: backtick table name +SELECT * FROM \`items\` +` + +// Issue #265: Backtick-escaped qualified table names (db.table) +const backtickQualifiedName = sql` +-- @db: db_mysql +-- @name: backtick qualified name +SELECT * FROM \`sqlx-ts\`.\`items\` +` + +// Issue #265: Backtick-escaped column names +const backtickColumnNames = sql` +-- @db: db_mysql +-- @name: backtick column names +SELECT \`id\`, \`name\` FROM \`items\` WHERE \`id\` = ? +` diff --git a/tests/demo/select/double_quote_escaping.queries.ts b/tests/demo/select/double_quote_escaping.queries.ts new file mode 100644 index 00000000..dce8f669 --- /dev/null +++ b/tests/demo/select/double_quote_escaping.queries.ts @@ -0,0 +1,41 @@ +export type DoubleQuoteTableNameParams = []; + +export interface IDoubleQuoteTableNameResult { + flavor_text: string | null; + id: number; + inventory_id: number | null; + name: string; + rarity: string | null; +} + +export interface IDoubleQuoteTableNameQuery { + params: DoubleQuoteTableNameParams; + result: IDoubleQuoteTableNameResult; +} + +export type DoubleQuoteQualifiedNameParams = []; + +export interface IDoubleQuoteQualifiedNameResult { + flavor_text: string | null; + id: number; + inventory_id: number | null; + name: string; + rarity: string | null; +} + +export interface IDoubleQuoteQualifiedNameQuery { + params: DoubleQuoteQualifiedNameParams; + result: IDoubleQuoteQualifiedNameResult; +} + +export type DoubleQuoteColumnNamesParams = [number]; + +export interface IDoubleQuoteColumnNamesResult { + id: number; + name: string; +} + +export interface IDoubleQuoteColumnNamesQuery { + params: DoubleQuoteColumnNamesParams; + result: IDoubleQuoteColumnNamesResult; +} diff --git a/tests/demo/select/double_quote_escaping.snapshot.ts b/tests/demo/select/double_quote_escaping.snapshot.ts new file mode 100644 index 00000000..dce8f669 --- /dev/null +++ b/tests/demo/select/double_quote_escaping.snapshot.ts @@ -0,0 +1,41 @@ +export type DoubleQuoteTableNameParams = []; + +export interface IDoubleQuoteTableNameResult { + flavor_text: string | null; + id: number; + inventory_id: number | null; + name: string; + rarity: string | null; +} + +export interface IDoubleQuoteTableNameQuery { + params: DoubleQuoteTableNameParams; + result: IDoubleQuoteTableNameResult; +} + +export type DoubleQuoteQualifiedNameParams = []; + +export interface IDoubleQuoteQualifiedNameResult { + flavor_text: string | null; + id: number; + inventory_id: number | null; + name: string; + rarity: string | null; +} + +export interface IDoubleQuoteQualifiedNameQuery { + params: DoubleQuoteQualifiedNameParams; + result: IDoubleQuoteQualifiedNameResult; +} + +export type DoubleQuoteColumnNamesParams = [number]; + +export interface IDoubleQuoteColumnNamesResult { + id: number; + name: string; +} + +export interface IDoubleQuoteColumnNamesQuery { + params: DoubleQuoteColumnNamesParams; + result: IDoubleQuoteColumnNamesResult; +} diff --git a/tests/demo/select/double_quote_escaping.ts b/tests/demo/select/double_quote_escaping.ts new file mode 100644 index 00000000..8a3e7984 --- /dev/null +++ b/tests/demo/select/double_quote_escaping.ts @@ -0,0 +1,19 @@ +import { sql } from 'sqlx-ts' + +// Issue #265: Double-quoted identifiers should work in PostgreSQL +const doubleQuoteTableName = sql` +-- @name: double quote table name +SELECT * FROM "items" +` + +// Double-quoted qualified table names (schema.table) +const doubleQuoteQualifiedName = sql` +-- @name: double quote qualified name +SELECT * FROM "public"."items" +` + +// Double-quoted column names with param +const doubleQuoteColumnNames = sql` +-- @name: double quote column names +SELECT "id", "name" FROM "items" WHERE "id" = $1 +`