Skip to content

Commit 7b13b3e

Browse files
authored
Merge pull request #216 from c42f/cjf/sqlstrings
Integration with SQLStrings.jl
2 parents de302c7 + 0b53764 commit 7b13b3e

File tree

5 files changed

+49
-1
lines changed

5 files changed

+49
-1
lines changed

Project.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "LibPQ"
22
uuid = "194296ae-ab2e-5f79-8cd4-7183a0a5a0d1"
33
license = "MIT"
4-
version = "1.11.0"
4+
version = "1.12.0"
55

66
[deps]
77
CEnum = "fa961155-64e5-5f13-b03f-caf6b980ea82"
@@ -17,6 +17,7 @@ LibPQ_jll = "08be9ffa-1c94-5ee5-a977-46a84ec9b350"
1717
Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
1818
Memento = "f28f55f0-a522-5efc-85c2-fe41dfb9b2d9"
1919
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
20+
SQLStrings = "af517c2e-c243-48fa-aab8-efac3db270f5"
2021
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
2122
TimeZones = "f269a46b-ccf7-5d73-abea-4c690281aa53"
2223

@@ -32,6 +33,7 @@ LayerDicts = "1"
3233
LibPQ_jll = "14"
3334
Memento = "0.10, 0.11, 0.12, 0.13, 1"
3435
OffsetArrays = "0.9.1, 0.10, 0.11, 1"
36+
SQLStrings = "0.1"
3537
Tables = "0.2, 1"
3638
TimeZones = "0.9.2, 0.10, 0.11, 1"
3739
julia = "1.6"

src/LibPQ.jl

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ using IterTools: imap
2626
using LayerDicts
2727
using Memento: Memento, getlogger, warn, info, error, debug
2828
using OffsetArrays
29+
using SQLStrings
2930
using TimeZones
3031

3132
const Parameter = Union{String,Missing}

src/asyncresults.jl

+5
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,11 @@ function _multi_async_execute(jl_conn::Connection, query::AbstractString; kwargs
236236
return async_result
237237
end
238238

239+
function async_execute(jl_conn::Connection, query::SQLStrings.Sql; kwargs...)
240+
query_str, parameters = SQLStrings.prepare(query)
241+
return async_execute(jl_conn, query_str, parameters; kwargs...)
242+
end
243+
239244
function async_execute(
240245
jl_conn::Connection,
241246
query::AbstractString,

src/results.jl

+5
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,11 @@ function _multi_execute(
299299
return handle_result(Result(result, jl_conn; kwargs...); throw_error=throw_error)
300300
end
301301

302+
function execute(jl_conn::Connection, query::SQLStrings.Sql; kwargs...)
303+
query_str, parameters = SQLStrings.prepare(query)
304+
return execute(jl_conn, query_str, parameters; kwargs...)
305+
end
306+
302307
function execute(
303308
jl_conn::Connection,
304309
query::AbstractString,

test/runtests.jl

+35
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ using IterTools: imap
1010
using Memento
1111
using Memento.TestUtils
1212
using OffsetArrays
13+
using SQLStrings
1314
using TimeZones
1415
using Tables
1516

@@ -1520,6 +1521,40 @@ end
15201521
close(conn)
15211522
end
15221523

1524+
@testset "SQLString" begin
1525+
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
1526+
1527+
execute(conn, sql```
1528+
CREATE TEMPORARY TABLE libpq_test_users (
1529+
id integer primary key,
1530+
name text
1531+
)```)
1532+
# The canonical SQL injection https://xkcd.com/327/
1533+
for (id,name) in [(1,"Foo"), (2, "Robert'); DROP TABLE libpq_test_users; --")]
1534+
execute(conn, sql```
1535+
INSERT INTO libpq_test_users
1536+
VALUES ( $id, $name )
1537+
```)
1538+
end
1539+
result = execute(conn, sql`SELECT * from libpq_test_users where id = 2`)
1540+
@test first(result).name == "Robert'); DROP TABLE libpq_test_users; --"
1541+
1542+
# Splatting example
1543+
user = (3,"Bar")
1544+
execute(conn, sql```
1545+
INSERT INTO libpq_test_users
1546+
VALUES ( $(user...) )
1547+
```)
1548+
bar_id = 3
1549+
result = execute(conn, sql`SELECT * from libpq_test_users where id = $bar_id`)
1550+
@test first(result).name == "Bar"
1551+
1552+
# Async with SqlStrings
1553+
ar = async_execute(conn, sql`SELECT * from libpq_test_users where id = 1`)
1554+
result = fetch(ar)
1555+
@test first(result).name == "Foo"
1556+
end
1557+
15231558
@testset "Query Errors" begin
15241559
@testset "Syntax Errors" begin
15251560
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)

0 commit comments

Comments
 (0)