Skip to content

Commit 9d2e604

Browse files
Merge pull request #471 from r-dbi/b-404-quote-double
fix: `dbQuoteLiteral()` uses exponential notation for numeric values
2 parents cb5235a + 180feb2 commit 9d2e604

File tree

3 files changed

+18
-12
lines changed

3 files changed

+18
-12
lines changed

R/dbQuoteLiteral_DBIConnection.R

+7-1
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,14 @@ dbQuoteLiteral_DBIConnection <- function(conn, x, ...) {
4848
return(SQL(blob_data, names = names(x)))
4949
}
5050

51+
if (is.double(x)) {
52+
out <- sprintf("%.17e", x)
53+
out[is.na(x)] <- "NULL"
54+
return(SQL(out, names = names(x)))
55+
}
56+
5157
if (is.logical(x)) {
52-
x <- as.numeric(x)
58+
x <- as.integer(x)
5359
}
5460

5561
x <- as.character(x)

tests/testthat/test-interpolate.R

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
test_that("parameter names matched", {
22
expect_equal(
3-
sqlInterpolate(ANSI(), "?a ?b", a = 1, b = 2),
3+
sqlInterpolate(ANSI(), "?a ?b", a = 1L, b = 2L),
44
SQL("1 2")
55
)
66

77
expect_equal(
8-
sqlInterpolate(ANSI(), "?a ?b", b = 2, a = 1),
8+
sqlInterpolate(ANSI(), "?a ?b", b = 2L, a = 1L),
99
SQL("1 2")
1010
)
1111

1212
expect_equal(
13-
sqlInterpolate(ANSI(), "?a ?b", b = 2, .dots = list(a = 1)),
13+
sqlInterpolate(ANSI(), "?a ?b", b = 2L, .dots = list(a = 1L)),
1414
SQL("1 2")
1515
)
1616

1717
expect_equal(
18-
sqlInterpolate(ANSI(), "?a ?b", .dots = list(a = 1, b = 2)),
18+
sqlInterpolate(ANSI(), "?a ?b", .dots = list(a = 1L, b = 2L)),
1919
SQL("1 2")
2020
)
2121
})
@@ -29,21 +29,21 @@ test_that("parameters in strings are ignored", {
2929

3030
test_that("named parameters check matches", {
3131
expect_error(
32-
sqlInterpolate(ANSI(), "?a ?b", a = 1, d = 2),
32+
sqlInterpolate(ANSI(), "?a ?b", a = 1L, d = 2L),
3333
"Supplied values don't match named vars to interpolate"
3434
)
3535
})
3636

3737
test_that("positional parameters work", {
3838
expect_equal(
39-
sqlInterpolate(ANSI(), "a ? c ? d ", 1, 2),
39+
sqlInterpolate(ANSI(), "a ? c ? d ", 1L, 2L),
4040
SQL("a 1 c 2 d ")
4141
)
4242
})
4343

4444
test_that("positional parameters can't have names", {
4545
expect_error(
46-
sqlInterpolate(ANSI(), "? ?", a = 1, 2),
46+
sqlInterpolate(ANSI(), "? ?", a = 1L, 2),
4747
"Positional variables don't take named arguments"
4848
)
4949
})
@@ -78,7 +78,7 @@ test_that("some more complex case works as well", {
7878

7979
test_that("escaping quotes with doubling works", {
8080
expect_equal(
81-
sqlInterpolate(ANSI(), "'this is a single '' one ?quoted string' ?bar ", bar = 42),
81+
sqlInterpolate(ANSI(), "'this is a single '' one ?quoted string' ?bar ", bar = 42L),
8282
SQL("'this is a single '' one ?quoted string' 42 ")
8383
)
8484
})
@@ -93,7 +93,7 @@ test_that("corner cases work", {
9393
"Supplied values don't match positional vars to interpolate"
9494
)
9595
expect_equal(
96-
sqlInterpolate(ANSI(), "?a", a = 1),
96+
sqlInterpolate(ANSI(), "?a", a = 1L),
9797
SQL("1")
9898
)
9999
expect_equal(
@@ -105,7 +105,7 @@ test_that("corner cases work", {
105105
"Unterminated literal"
106106
)
107107
expect_equal(
108-
sqlInterpolate(ANSI(), "?a\"\"?b", a = 1, b = 2),
108+
sqlInterpolate(ANSI(), "?a\"\"?b", a = 1L, b = 2L),
109109
SQL("1\"\"2")
110110
)
111111
expect_equal(

tests/testthat/test-sql-df.R

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ test_that("NAs turn in NULLs", {
66
)
77
sql_df <- sqlData(ANSI(), df)
88

9-
expect_equal(sql_df$x, SQL(c("1", "NULL")))
9+
expect_equal(sql_df$x, SQL(c("1.00000000000000000e+00", "NULL")))
1010
expect_equal(sql_df$y, SQL(c("'a'", "NULL")))
1111
})

0 commit comments

Comments
 (0)