Skip to content

Commit 2308e63

Browse files
committed
db: Prevent generic query logs from replacing inserted content
1 parent 04c8fd3 commit 2308e63

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/core/db/query/GenericParametrizedQueryFactory.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ internal object GenericParametrizedQueryFactory : ParametrizedQueryFactory<Gener
3030
val value = values[paramIndex] ?: "?"
3131

3232
builder.replace(builderIndex, builderIndex + 1, value)
33-
builderIndex++ //as to not keep seeking the same character
33+
builderIndex += value.length // Ensure we don't try to find characters in what we inserted
3434
paramIndex++
3535
}
3636

@@ -41,4 +41,4 @@ internal object GenericParametrizedQueryFactory : ParametrizedQueryFactory<Gener
4141
override fun isSupported(connection: Connection, databaseMetaData: DatabaseMetaData): Boolean = true
4242

4343
override fun get(preparedStatement: PreparedStatement, sql: String): GenericParametrizedQuery = GenericParametrizedQuery(preparedStatement, sql)
44-
}
44+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.github.freya022.botcommands.db.query
2+
3+
import io.github.freya022.botcommands.internal.core.db.query.GenericParametrizedQueryFactory.GenericParametrizedQuery
4+
import io.mockk.every
5+
import io.mockk.mockk
6+
import org.junit.jupiter.params.ParameterizedTest
7+
import org.junit.jupiter.params.provider.Arguments
8+
import org.junit.jupiter.params.provider.MethodSource
9+
import java.sql.PreparedStatement
10+
import kotlin.test.assertEquals
11+
12+
object GenericParametrizedQueryTests {
13+
14+
@MethodSource("parametrizedQueries")
15+
@ParameterizedTest
16+
fun `Format parametrized queries`(query: String, expected: String, values: Map<Int, Any>) {
17+
val statement = mockk<PreparedStatement> {
18+
every { enquoteLiteral(any()) } answers { callOriginal() }
19+
}
20+
val query = GenericParametrizedQuery(statement, query)
21+
values.forEach { (key, value) -> query.addValue(key, value) }
22+
23+
assertEquals(expected, query.toSql())
24+
}
25+
26+
@JvmStatic
27+
fun parametrizedQueries(): List<Arguments> = listOf(
28+
parametrizedQuery(
29+
name = "Ensure '?' in content is not replaced",
30+
query = "insert into test (a, b) values (?, ?)",
31+
expected = "insert into test (a, b) values ('?', 1)",
32+
values = mapOf(
33+
1 to "?",
34+
2 to 1,
35+
)
36+
),
37+
)
38+
39+
private fun parametrizedQuery(name: String, query: String, expected: String, values: Map<Int, Any>): Arguments =
40+
Arguments.argumentSet(name, query, expected, values)
41+
}

0 commit comments

Comments
 (0)