From c76cca1a5d9ef7369c018fa3c1c7a90cf9808b1f Mon Sep 17 00:00:00 2001 From: Daniel Rizk Date: Thu, 29 Aug 2024 12:08:13 -0400 Subject: [PATCH] fix type casting as part of larger mutation --- NEWS.md | 2 ++ Project.toml | 2 +- src/TidierDB.jl | 6 +++++- src/parsing_athena.jl | 6 +++--- src/parsing_duckdb.jl | 6 +++--- src/parsing_gbq.jl | 6 +++--- src/parsing_mssql.jl | 6 +++--- src/parsing_mysql.jl | 6 +++--- src/parsing_oracle.jl | 6 +++--- src/parsing_postgres.jl | 6 +++--- src/parsing_snowflake.jl | 6 +++--- src/parsing_sqlite.jl | 6 +++--- 12 files changed, 35 insertions(+), 29 deletions(-) diff --git a/NEWS.md b/NEWS.md index 8d1ae38..419fd3d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # TidierDB.jl updates +## v0.3.3 - 2024-08-29 +- Bugfix: `@mutate` allows type conversion as part of larger mutate expressions ## v0.3.2 - 2024-08-26 - adds `@head` for limiting number of collected rows diff --git a/Project.toml b/Project.toml index c4ca345..0fb28b3 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "TidierDB" uuid = "86993f9b-bbba-4084-97c5-ee15961ad48b" authors = ["Daniel Rizk and contributors"] -version = "0.3.2" +version = "0.3.3" [deps] Arrow = "69666777-d1a9-59fb-9406-91d4454c9d45" diff --git a/src/TidierDB.jl b/src/TidierDB.jl index 0bd5cb3..611196b 100644 --- a/src/TidierDB.jl +++ b/src/TidierDB.jl @@ -150,9 +150,13 @@ function finalize_query(sqlquery::SQLQuery) if !isempty(sqlquery.ch_settings) && current_sql_mode[] == clickhouse() complete_query = complete_query * " \n " * string(sqlquery.ch_settings) end + complete_query = replace(complete_query, "&&" => " AND ", "||" => " OR ", "FROM )" => ")" , "SELECT SELECT " => "SELECT ", "SELECT SELECT " => "SELECT ", "DISTINCT SELECT " => "DISTINCT ", - "SELECT SELECT SELECT " => "SELECT ", "PARTITION BY GROUP BY" => "PARTITION BY", "GROUP BY GROUP BY" => "GROUP BY", "HAVING HAVING" => "HAVING", ) + "SELECT SELECT SELECT " => "SELECT ", "PARTITION BY GROUP BY" => "PARTITION BY", "GROUP BY GROUP BY" => "GROUP BY", "HAVING HAVING" => "HAVING", + r"var\"(.*?)\"" => s"\1") + + complete_query = replace(complete_query, ", AS " => " AS ") if current_sql_mode[] == postgres() || current_sql_mode[] == duckdb() || current_sql_mode[] == mysql() || current_sql_mode[] == mssql() || current_sql_mode[] == clickhouse() || current_sql_mode[] == athena() || current_sql_mode[] == gbq() || current_sql_mode[] == oracle() || current_sql_mode[] == snowflake() || current_sql_mode[] == databricks() complete_query = replace(complete_query, "\"" => "'", "==" => "=") diff --git a/src/parsing_athena.jl b/src/parsing_athena.jl index 0ea4e97..ecb81de 100644 --- a/src/parsing_athena.jl +++ b/src/parsing_athena.jl @@ -126,13 +126,13 @@ function expr_to_sql_trino(expr, sq; from_summarize::Bool) return parse_if_else(x) elseif x.args[1] == :as_float && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS DECIMAL)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS DECIMAL")) elseif x.args[1] == :as_integer && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS INT)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS INT")) elseif x.args[1] == :as_string && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS STRING)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS STRING")) elseif x.args[1] == :case_when return parse_case_when(x) elseif isa(x, Expr) && x.head == :call && x.args[1] == :! && x.args[1] != :!= && length(x.args) == 2 diff --git a/src/parsing_duckdb.jl b/src/parsing_duckdb.jl index da9dc2c..a8ce019 100644 --- a/src/parsing_duckdb.jl +++ b/src/parsing_duckdb.jl @@ -125,13 +125,13 @@ function expr_to_sql_duckdb(expr, sq; from_summarize::Bool) return parse_if_else(x) elseif x.args[1] == :as_float && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS DECIMAL)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS DECIMAL")) elseif x.args[1] == :as_integer && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS INT)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS INT")) elseif x.args[1] == :as_string && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS STRING)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS STRING")) elseif x.args[1] == :case_when return parse_case_when(x) elseif isa(x, Expr) && x.head == :call && x.args[1] == :! && x.args[1] != :!= && length(x.args) == 2 diff --git a/src/parsing_gbq.jl b/src/parsing_gbq.jl index d2ddb67..fdeec20 100644 --- a/src/parsing_gbq.jl +++ b/src/parsing_gbq.jl @@ -155,13 +155,13 @@ function expr_to_sql_gbq(expr, sq; from_summarize::Bool) return parse_if_else(x) elseif x.args[1] == :as_float && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS DECIMAL)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS DECIMAL")) elseif x.args[1] == :as_integer && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS INT)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS INT")) elseif x.args[1] == :as_string && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS STRING)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS STRING")) elseif x.args[1] == :case_when return parse_case_when(x) elseif isa(x, Expr) && x.head == :call && x.args[1] == :! && x.args[1] != :!= && length(x.args) == 2 diff --git a/src/parsing_mssql.jl b/src/parsing_mssql.jl index 8d92cbb..4f07dd7 100644 --- a/src/parsing_mssql.jl +++ b/src/parsing_mssql.jl @@ -126,13 +126,13 @@ function expr_to_sql_mssql(expr, sq; from_summarize::Bool) return parse_if_else(x) elseif x.args[1] == :as_float && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS DECIMAL)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS DECIMAL")) elseif x.args[1] == :as_integer && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS INTEGER)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS INTEGER")) elseif x.args[1] == :as_string && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS STRING)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS STRING")) elseif x.args[1] == :case_when return parse_case_when(x) elseif isa(x, Expr) && x.head == :call && x.args[1] == :! && x.args[1] != :!= && length(x.args) == 2 diff --git a/src/parsing_mysql.jl b/src/parsing_mysql.jl index 971c95f..8a150fe 100644 --- a/src/parsing_mysql.jl +++ b/src/parsing_mysql.jl @@ -125,13 +125,13 @@ function expr_to_sql_mysql(expr, sq; from_summarize::Bool) return parse_if_else(x) elseif x.args[1] == :as_float && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS DECIMAL)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS DECIMAL")) elseif x.args[1] == :as_integer && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS UNSIGNED)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS UNSIGNED")) elseif x.args[1] == :as_string && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS STRING)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS STRING")) elseif x.args[1] == :case_when return parse_case_when(x) elseif isa(x, Expr) && x.head == :call && x.args[1] == :! && x.args[1] != :!= && length(x.args) == 2 diff --git a/src/parsing_oracle.jl b/src/parsing_oracle.jl index 75d898c..b6c94f2 100644 --- a/src/parsing_oracle.jl +++ b/src/parsing_oracle.jl @@ -126,13 +126,13 @@ function expr_to_sql_oracle(expr, sq; from_summarize::Bool) return parse_if_else(x) elseif x.args[1] == :as_float && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS DECIMAL)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS DECIMAL")) elseif x.args[1] == :as_integer && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS INTEGER)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS INTEGER")) elseif x.args[1] == :as_string && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS STRING)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS STRING")) elseif x.args[1] == :case_when return parse_case_when(x) elseif isa(x, Expr) && x.head == :call && x.args[1] == :! && x.args[1] != :!= && length(x.args) == 2 diff --git a/src/parsing_postgres.jl b/src/parsing_postgres.jl index 8a2f8f8..7aeb318 100644 --- a/src/parsing_postgres.jl +++ b/src/parsing_postgres.jl @@ -124,13 +124,13 @@ function expr_to_sql_postgres(expr, sq; from_summarize::Bool) return parse_if_else(x) elseif x.args[1] == :as_float && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS DECIMAL)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS DECIMAL")) elseif x.args[1] == :as_integer && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS INT)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS INT")) elseif x.args[1] == :as_string && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS STRING)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS STRING")) elseif x.args[1] == :case_when return parse_case_when(x) elseif isa(x, Expr) && x.head == :call && x.args[1] == :! && x.args[1] != :!= && length(x.args) == 2 diff --git a/src/parsing_snowflake.jl b/src/parsing_snowflake.jl index 6773767..30a10b6 100644 --- a/src/parsing_snowflake.jl +++ b/src/parsing_snowflake.jl @@ -125,13 +125,13 @@ function expr_to_sql_snowflake(expr, sq; from_summarize::Bool) return parse_if_else(x) elseif x.args[1] == :as_float && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS DECIMAL)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS DECIMAL")) elseif x.args[1] == :as_integer && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS INT)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS INT")) elseif x.args[1] == :as_string && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS STRING)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS STRING")) elseif x.args[1] == :case_when return parse_case_when(x) elseif isa(x, Expr) && x.head == :call && x.args[1] == :! && x.args[1] != :!= && length(x.args) == 2 diff --git a/src/parsing_sqlite.jl b/src/parsing_sqlite.jl index a806364..c6a2af1 100644 --- a/src/parsing_sqlite.jl +++ b/src/parsing_sqlite.jl @@ -75,13 +75,13 @@ function expr_to_sql_lite(expr, sq; from_summarize::Bool) elseif x.args[1] == :as_float && length(x.args) == 2 column = x.args[2] # Return the SQL CAST statement directly as a string - return "CAST(" * string(column) * " AS DOUBLE)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS DOUBLE")) elseif x.args[1] == :as_integer && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS INT)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS INT")) elseif x.args[1] == :as_string && length(x.args) == 2 column = x.args[2] - return "CAST(" * string(column) * " AS STRING)" + return Expr(:call, Symbol("CAST"), column, Symbol("AS STRING")) elseif x.args[1] == :case_when return parse_case_when(x) elseif isa(x, Expr) && x.head == :call && x.args[1] == :! && length(x.args) == 2