Skip to content

Commit

Permalink
Ignore interpolation and escapes in the generated query string
Browse files Browse the repository at this point in the history
  • Loading branch information
jonatanklosko committed Jul 26, 2024
1 parent e789e94 commit f3c7d8a
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 46 deletions.
4 changes: 2 additions & 2 deletions lib/kino_db/sql_cell.ex
Original file line number Diff line number Diff line change
Expand Up @@ -296,9 +296,9 @@ defmodule KinoDB.SQLCell do

defp quoted_query(query) do
if String.contains?(query, "\n") do
{:<<>>, [delimiter: ~s["""]], [query <> "\n"]}
{:sigil_S, [delimiter: ~s["""]], [{:<<>>, [], [query <> "\n"]}, []]}
else
query
{:sigil_S, [delimiter: ~s["]], [{:<<>>, [], [query]}, []]}
end
end

Expand Down
118 changes: 74 additions & 44 deletions test/kino_db/sql_cell_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ defmodule KinoDB.SQLCellTest do

assert source ==
"""
ids_result = Postgrex.query!(db, "SELECT id FROM users", [])\
ids_result = Postgrex.query!(db, ~S"SELECT id FROM users", [])\
"""
end
end
Expand Down Expand Up @@ -74,31 +74,31 @@ defmodule KinoDB.SQLCellTest do
}

assert SQLCell.to_source(attrs) == """
result = Postgrex.query!(conn, "SELECT id FROM users", [])\
result = Postgrex.query!(conn, ~S"SELECT id FROM users", [])\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "mysql")) == """
result = MyXQL.query!(conn, "SELECT id FROM users", [])\
result = MyXQL.query!(conn, ~S"SELECT id FROM users", [])\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "sqlite")) == """
result = Exqlite.query!(conn, "SELECT id FROM users", [])\
result = Exqlite.query!(conn, ~S"SELECT id FROM users", [])\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "bigquery")) == """
result = Req.post!(conn, bigquery: {\"SELECT id FROM users\", []}).body\
result = Req.post!(conn, bigquery: {~S"SELECT id FROM users", []}).body\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "athena")) == """
result = Req.post!(conn, athena: {\"SELECT id FROM users\", []}).body\
result = Req.post!(conn, athena: {~S"SELECT id FROM users", []}).body\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "snowflake")) == """
result = Explorer.DataFrame.from_query!(conn, "SELECT id FROM users", [])\
result = Explorer.DataFrame.from_query!(conn, ~S"SELECT id FROM users", [])\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "sqlserver")) == """
result = Tds.query!(conn, "SELECT id FROM users", [])\
result = Tds.query!(conn, ~S"SELECT id FROM users", [])\
"""
end

Expand All @@ -115,7 +115,7 @@ defmodule KinoDB.SQLCellTest do
result =
Postgrex.query!(
conn,
"""
~S"""
SELECT id FROM users
WHERE last_name = 'Sherlock'
""",
Expand All @@ -127,7 +127,7 @@ defmodule KinoDB.SQLCellTest do
result =
MyXQL.query!(
conn,
"""
~S"""
SELECT id FROM users
WHERE last_name = 'Sherlock'
""",
Expand All @@ -139,7 +139,7 @@ defmodule KinoDB.SQLCellTest do
result =
Exqlite.query!(
conn,
"""
~S"""
SELECT id FROM users
WHERE last_name = 'Sherlock'
""",
Expand All @@ -151,7 +151,7 @@ defmodule KinoDB.SQLCellTest do
result =
Req.post!(conn,
bigquery:
{"""
{~S"""
SELECT id FROM users
WHERE last_name = 'Sherlock'
""", []}
Expand All @@ -162,7 +162,7 @@ defmodule KinoDB.SQLCellTest do
result =
Req.post!(conn,
athena:
{"""
{~S"""
SELECT id FROM users
WHERE last_name = 'Sherlock'
""", []}
Expand All @@ -173,7 +173,7 @@ defmodule KinoDB.SQLCellTest do
result =
Explorer.DataFrame.from_query!(
conn,
"""
~S"""
SELECT id FROM users
WHERE last_name = 'Sherlock'
""",
Expand All @@ -185,7 +185,7 @@ defmodule KinoDB.SQLCellTest do
result =
Tds.query!(
conn,
"""
~S"""
SELECT id FROM users
WHERE last_name = 'Sherlock'
""",
Expand All @@ -205,23 +205,23 @@ defmodule KinoDB.SQLCellTest do

assert SQLCell.to_source(attrs) == ~s'''
result =
Postgrex.query!(conn, "SELECT id FROM users WHERE id $1 AND name LIKE $2", [
Postgrex.query!(conn, ~S"SELECT id FROM users WHERE id $1 AND name LIKE $2", [
user_id,
search <> "%"
])\
'''

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "mysql")) == ~s'''
result =
MyXQL.query!(conn, "SELECT id FROM users WHERE id ? AND name LIKE ?", [
MyXQL.query!(conn, ~S"SELECT id FROM users WHERE id ? AND name LIKE ?", [
user_id,
search <> "%"
])\
'''

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "sqlite")) == ~s'''
result =
Exqlite.query!(conn, "SELECT id FROM users WHERE id ?1 AND name LIKE ?2", [
Exqlite.query!(conn, ~S"SELECT id FROM users WHERE id ?1 AND name LIKE ?2", [
user_id,
search <> "%"
])\
Expand All @@ -231,29 +231,30 @@ defmodule KinoDB.SQLCellTest do
result =
Req.post!(conn,
bigquery:
{"SELECT id FROM users WHERE id ? AND name LIKE ?", [user_id, search <> "%"]}
{~S"SELECT id FROM users WHERE id ? AND name LIKE ?", [user_id, search <> "%"]}
).body\
'''

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "athena")) == ~s'''
result =
Req.post!(conn,
athena: {"SELECT id FROM users WHERE id ? AND name LIKE ?", [user_id, search <> "%"]}
athena:
{~S"SELECT id FROM users WHERE id ? AND name LIKE ?", [user_id, search <> "%"]}
).body\
'''

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "snowflake")) == ~s'''
result =
Explorer.DataFrame.from_query!(
conn,
"SELECT id FROM users WHERE id ?1 AND name LIKE ?2",
~S"SELECT id FROM users WHERE id ?1 AND name LIKE ?2",
[user_id, search <> \"%\"]
)\
'''

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "sqlserver")) == ~s'''
result =
Tds.query!(conn, "SELECT id FROM users WHERE id @1 AND name LIKE @2", [
Tds.query!(conn, ~S"SELECT id FROM users WHERE id @1 AND name LIKE @2", [
%Tds.Parameter{name: "@1", value: user_id},
%Tds.Parameter{name: "@2", value: search <> "%"}
])\
Expand All @@ -277,7 +278,7 @@ defmodule KinoDB.SQLCellTest do
result =
Postgrex.query!(
conn,
"""
~S"""
SELECT id from users
-- WHERE id = {{user_id1}}
/* WHERE id = {{user_id2}} */ WHERE id = $1
Expand All @@ -290,7 +291,7 @@ defmodule KinoDB.SQLCellTest do
result =
MyXQL.query!(
conn,
"""
~S"""
SELECT id from users
-- WHERE id = {{user_id1}}
/* WHERE id = {{user_id2}} */ WHERE id = ?
Expand All @@ -303,7 +304,7 @@ defmodule KinoDB.SQLCellTest do
result =
Exqlite.query!(
conn,
"""
~S"""
SELECT id from users
-- WHERE id = {{user_id1}}
/* WHERE id = {{user_id2}} */ WHERE id = ?1
Expand All @@ -316,7 +317,7 @@ defmodule KinoDB.SQLCellTest do
result =
Req.post!(conn,
bigquery:
{"""
{~S"""
SELECT id from users
-- WHERE id = {{user_id1}}
/* WHERE id = {{user_id2}} */ WHERE id = ?
Expand All @@ -328,7 +329,7 @@ defmodule KinoDB.SQLCellTest do
result =
Req.post!(conn,
athena:
{"""
{~S"""
SELECT id from users
-- WHERE id = {{user_id1}}
/* WHERE id = {{user_id2}} */ WHERE id = ?
Expand All @@ -340,7 +341,7 @@ defmodule KinoDB.SQLCellTest do
result =
Explorer.DataFrame.from_query!(
conn,
"""
~S"""
SELECT id from users
-- WHERE id = {{user_id1}}
/* WHERE id = {{user_id2}} */ WHERE id = ?1
Expand All @@ -353,7 +354,7 @@ defmodule KinoDB.SQLCellTest do
result =
Tds.query!(
conn,
"""
~S"""
SELECT id from users
-- WHERE id = {{user_id1}}
/* WHERE id = {{user_id2}} */ WHERE id = @1
Expand All @@ -373,31 +374,31 @@ defmodule KinoDB.SQLCellTest do
}

assert SQLCell.to_source(attrs) == """
result = Postgrex.query!(conn, "SELECT id FROM users", [], timeout: 30000)\
result = Postgrex.query!(conn, ~S"SELECT id FROM users", [], timeout: 30000)\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "mysql")) == """
result = MyXQL.query!(conn, "SELECT id FROM users", [], timeout: 30000)\
result = MyXQL.query!(conn, ~S"SELECT id FROM users", [], timeout: 30000)\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "sqlite")) == """
result = Exqlite.query!(conn, "SELECT id FROM users", [], timeout: 30000)\
result = Exqlite.query!(conn, ~S"SELECT id FROM users", [], timeout: 30000)\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "bigquery")) == """
result = Req.post!(conn, bigquery: {"SELECT id FROM users", []}).body\
result = Req.post!(conn, bigquery: {~S"SELECT id FROM users", []}).body\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "athena")) == """
result = Req.post!(conn, athena: {"SELECT id FROM users", []}).body\
result = Req.post!(conn, athena: {~S"SELECT id FROM users", []}).body\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "snowflake")) == """
result = Explorer.DataFrame.from_query!(conn, "SELECT id FROM users", [])\
result = Explorer.DataFrame.from_query!(conn, ~S"SELECT id FROM users", [])\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "sqlserver")) == """
result = Tds.query!(conn, "SELECT id FROM users", [], timeout: 30000)\
result = Tds.query!(conn, ~S"SELECT id FROM users", [], timeout: 30000)\
"""
end

Expand All @@ -411,38 +412,67 @@ defmodule KinoDB.SQLCellTest do
}

assert SQLCell.to_source(attrs) == """
result = Postgrex.query!(conn, "SELECT id FROM users", [])\
result = Postgrex.query!(conn, ~S"SELECT id FROM users", [])\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "mysql")) == """
result = MyXQL.query!(conn, "SELECT id FROM users", [])\
result = MyXQL.query!(conn, ~S"SELECT id FROM users", [])\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "sqlite")) == """
result = Exqlite.query!(conn, "SELECT id FROM users", [])\
result = Exqlite.query!(conn, ~S"SELECT id FROM users", [])\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "snowflake")) == """
result = DF.from_query!(conn, "SELECT id FROM users", [])\
result = DF.from_query!(conn, ~S"SELECT id FROM users", [])\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "bigquery")) == """
result = Req.post!(conn, bigquery: {"SELECT id FROM users", []}).body\
result = Req.post!(conn, bigquery: {~S"SELECT id FROM users", []}).body\
"""

athena = put_in(attrs["connection"]["type"], "athena")

assert SQLCell.to_source(put_in(athena["cache_query"], true)) == """
result = Req.post!(conn, athena: {"SELECT id FROM users", []}, cache_query: true).body\
result = Req.post!(conn, athena: {~S"SELECT id FROM users", []}, cache_query: true).body\
"""

assert SQLCell.to_source(put_in(athena["cache_query"], false)) == """
result = Req.post!(conn, athena: {"SELECT id FROM users", []}, cache_query: false).body\
result = Req.post!(conn, athena: {~S"SELECT id FROM users", []}, cache_query: false).body\
"""

assert SQLCell.to_source(put_in(attrs["connection"]["type"], "sqlserver")) == """
result = Tds.query!(conn, "SELECT id FROM users", [])\
result = Tds.query!(conn, ~S"SELECT id FROM users", [])\
"""
end

test "escapes interpolation" do
attrs = %{
"connection" => %{"variable" => "conn", "type" => "postgres"},
"result_variable" => "result",
"timeout" => nil,
"query" => "SELECT id FROM users WHERE last_name = '\#{user_id}'",
"data_frame_alias" => Explorer.DataFrame
}

assert SQLCell.to_source(attrs) == """
result =
Postgrex.query!(conn, ~S"SELECT id FROM users WHERE last_name = '\#{user_id}'", [])\
"""

athena = put_in(attrs["query"], "SELECT id FROM users\nWHERE last_name = '\#{user_id}'")

assert SQLCell.to_source(put_in(athena["cache_query"], true)) == ~s'''
result =
Postgrex.query!(
conn,
~S"""
SELECT id FROM users
WHERE last_name = '\#{user_id}'
""",
[]
)\
'''
end
end
end

0 comments on commit f3c7d8a

Please sign in to comment.