Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 120ba4f

Browse files
committed
SqlBinaryExpr changes
Use SqlCastExpr tyoe or use SqlColumExpr to get column type Add Tests for Bind argument when used with CAST and Binary Expression
1 parent 3caadac commit 120ba4f

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/Arguments.kt

+15-1
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,16 @@ import app.cash.sqldelight.dialect.api.PrimitiveType.NULL
2525
import app.cash.sqldelight.dialect.api.PrimitiveType.TEXT
2626
import app.cash.sqldelight.dialect.api.SelectQueryable
2727
import com.alecstrong.sql.psi.core.psi.SqlBetweenExpr
28+
import com.alecstrong.sql.psi.core.psi.SqlBinaryBooleanExpr
29+
import com.alecstrong.sql.psi.core.psi.SqlBinaryEqualityExpr
2830
import com.alecstrong.sql.psi.core.psi.SqlBinaryExpr
2931
import com.alecstrong.sql.psi.core.psi.SqlBinaryLikeExpr
32+
import com.alecstrong.sql.psi.core.psi.SqlBinaryPipeExpr
3033
import com.alecstrong.sql.psi.core.psi.SqlBindExpr
3134
import com.alecstrong.sql.psi.core.psi.SqlCaseExpr
3235
import com.alecstrong.sql.psi.core.psi.SqlCastExpr
3336
import com.alecstrong.sql.psi.core.psi.SqlCollateExpr
37+
import com.alecstrong.sql.psi.core.psi.SqlColumnExpr
3438
import com.alecstrong.sql.psi.core.psi.SqlCompoundSelectStmt
3539
import com.alecstrong.sql.psi.core.psi.SqlExpr
3640
import com.alecstrong.sql.psi.core.psi.SqlFunctionExpr
@@ -114,11 +118,21 @@ internal fun SqlExpr.argumentType(argument: SqlExpr): IntermediateType {
114118
IntermediateType(PrimitiveType.BOOLEAN)
115119
}
116120
}
117-
is SqlBetweenExpr, is SqlIsExpr, is SqlBinaryExpr -> {
121+
122+
is SqlBinaryPipeExpr, is SqlBinaryEqualityExpr, is SqlIsExpr, is SqlBinaryBooleanExpr, is SqlBetweenExpr -> {
118123
val validArg = children.lastOrNull { it is SqlExpr && it !== argument && it !is SqlBindExpr }
119124
validArg?.type() ?: children.last { it is SqlExpr && it !== argument }.type()
120125
}
121126

127+
is SqlBinaryExpr -> {
128+
val validArg = children.lastOrNull { it is SqlCastExpr && it == argument } ?: if (children.none() { it is SqlColumnExpr }) {
129+
parent.children.lastOrNull { it is SqlExpr && it !== argument && it !is SqlBinaryExpr }
130+
} else {
131+
children.lastOrNull { it is SqlExpr && it !== argument && it !is SqlBindExpr }
132+
}
133+
validArg?.type() ?: children.last { it is SqlExpr && it !== argument }.type()
134+
}
135+
122136
is SqlNullExpr -> IntermediateType(NULL).asNullable()
123137
is SqlBinaryLikeExpr -> {
124138
val other = children.last { it is SqlExpr && it !== argument }.type()

sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/BindArgsTest.kt

+53
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package app.cash.sqldelight.core
22

3+
import app.cash.sqldelight.core.lang.argumentType
34
import app.cash.sqldelight.core.lang.types.typeResolver
45
import app.cash.sqldelight.core.lang.util.argumentType
56
import app.cash.sqldelight.core.lang.util.findChildrenOfType
@@ -386,5 +387,57 @@ class BindArgsTest {
386387
}
387388
}
388389

390+
@Test fun `bind arg type in binary expression can be inferred from column`() {
391+
val file = FixtureCompiler.parseSql(
392+
"""
393+
|CREATE TABLE data (
394+
| datum INTEGER NOT NULL
395+
|);
396+
|
397+
|selectData:
398+
|SELECT *
399+
|FROM data
400+
|WHERE datum > :datum1 - 2.5 AND datum < :datum2 + 2.5;
401+
""".trimMargin(),
402+
tempFolder,
403+
)
404+
val column = file.namedQueries.first()
405+
column.parameters.let { args ->
406+
assertThat(args[0].dialectType).isEqualTo(PrimitiveType.INTEGER)
407+
assertThat(args[0].javaType).isEqualTo(Long::class.asClassName())
408+
assertThat(args[0].name).isEqualTo("datum1")
409+
410+
assertThat(args[1].dialectType).isEqualTo(PrimitiveType.INTEGER)
411+
assertThat(args[1].javaType).isEqualTo(Long::class.asClassName())
412+
assertThat(args[1].name).isEqualTo("datum2")
413+
}
414+
}
415+
416+
@Test fun `bind arg in binary expression can be cast as type`() {
417+
val file = FixtureCompiler.parseSql(
418+
"""
419+
|CREATE TABLE data (
420+
| datum INTEGER NOT NULL
421+
|);
422+
|
423+
|selectData:
424+
|SELECT CAST(:datum1 AS REAL) + CAST(:datum2 AS INTEGER) - 10.5
425+
|FROM data;
426+
""".trimMargin(),
427+
tempFolder,
428+
)
429+
430+
val column = file.namedQueries.first()
431+
column.parameters.let { args ->
432+
assertThat(args[0].dialectType).isEqualTo(PrimitiveType.REAL)
433+
assertThat(args[0].javaType).isEqualTo(Double::class.asClassName().copy(nullable = true))
434+
assertThat(args[0].name).isEqualTo("datum1")
435+
436+
assertThat(args[1].dialectType).isEqualTo(PrimitiveType.INTEGER)
437+
assertThat(args[1].javaType).isEqualTo(Long::class.asClassName().copy(nullable = true))
438+
assertThat(args[1].name).isEqualTo("datum2")
439+
}
440+
}
441+
389442
private fun SqlBindExpr.argumentType() = typeResolver.argumentType(this)
390443
}

0 commit comments

Comments
 (0)