Skip to content

Commit f628057

Browse files
committed
Integration with SQLStrings.jl
This integrates the SQLStrings package into LibPQ, making it usable with the execute() function.
1 parent de302c7 commit f628057

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 1 addition & 0 deletions
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/results.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,16 @@ function _multi_execute(
299299
return handle_result(Result(result, jl_conn; kwargs...); throw_error=throw_error)
300300
end
301301

302+
function execute(
303+
jl_conn::Connection,
304+
sql::SQLStrings.Sql;
305+
throw_error::Bool=true,
306+
kwargs...
307+
)
308+
query, parameters = SQLStrings.prepare(sql)
309+
execute(jl_conn, query, parameters; throw_error=throw_error, kwargs...)
310+
end
311+
302312
function execute(
303313
jl_conn::Connection,
304314
query::AbstractString,

test/runtests.jl

Lines changed: 30 additions & 0 deletions
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,35 @@ 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+
end
1552+
15231553
@testset "Query Errors" begin
15241554
@testset "Syntax Errors" begin
15251555
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)

0 commit comments

Comments
 (0)