Skip to content

Commit fc8e45f

Browse files
authored
Remove wrong questionmark replacement (#74)
* Remove wrong questionmark replacement * Fix resetting normal postgresql parser Co-authored-by: hfhbd <[email protected]>
1 parent a3504ed commit fc8e45f

File tree

9 files changed

+136
-17
lines changed

9 files changed

+136
-17
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ plugins {
99
id("io.github.gradle-nexus.publish-plugin") version "1.1.0"
1010
id("org.jetbrains.kotlinx.binary-compatibility-validator") version "0.11.1"
1111
id("com.github.johnrengelman.shadow") version "7.1.2" apply false
12+
id("com.alecstrong.grammar.kit.composer") version "0.1.10" apply false
1213
id("app.cash.sqldelight") version "2.0.0-alpha04" apply false
1314
id("app.cash.licensee") version "1.5.0" apply false
1415
}

postgres-native-sqldelight-dialect/api/postgres-native-sqldelight-dialect.api

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,31 @@
1+
public abstract class app/softwork/sqldelight/postgresdialect/BindParameterMixin : app/cash/sqldelight/dialect/grammar/mixins/BindParameterMixin {
2+
public fun <init> (Lcom/intellij/lang/ASTNode;)V
3+
public fun replaceWith (ZI)Ljava/lang/String;
4+
}
5+
6+
public class app/softwork/sqldelight/postgresdialect/PostgreSqlNativeParser : com/intellij/lang/LightPsiParser, com/intellij/lang/PsiParser {
7+
public fun <init> ()V
8+
public static fun bind_parameter_real (Lcom/intellij/lang/PsiBuilder;I)Z
9+
public static fun overrides_real (Lcom/intellij/lang/PsiBuilder;I)Z
10+
public fun parse (Lcom/intellij/psi/tree/IElementType;Lcom/intellij/lang/PsiBuilder;)Lcom/intellij/lang/ASTNode;
11+
public fun parseLight (Lcom/intellij/psi/tree/IElementType;Lcom/intellij/lang/PsiBuilder;)V
12+
protected fun parse_root_ (Lcom/intellij/psi/tree/IElementType;Lcom/intellij/lang/PsiBuilder;)Z
13+
}
14+
15+
public final class app/softwork/sqldelight/postgresdialect/PostgreSqlNativeParserUtil : com/intellij/lang/parser/GeneratedParserUtilBase {
16+
public static final field INSTANCE Lapp/softwork/sqldelight/postgresdialect/PostgreSqlNativeParserUtil;
17+
public static final fun bindParameterExt (Lcom/intellij/lang/PsiBuilder;ILcom/intellij/lang/parser/GeneratedParserUtilBase$Parser;)Z
18+
public final fun getBind_parameter ()Lcom/intellij/lang/parser/GeneratedParserUtilBase$Parser;
19+
public final fun getCreateElement ()Lkotlin/jvm/functions/Function1;
20+
public final fun getOverrides ()Lcom/intellij/lang/parser/GeneratedParserUtilBase$Parser;
21+
public final fun overrideSqlParser ()V
22+
public static final fun overridesExt (Lcom/intellij/lang/PsiBuilder;ILcom/intellij/lang/parser/GeneratedParserUtilBase$Parser;)Z
23+
public final fun reset ()V
24+
public final fun setBind_parameter (Lcom/intellij/lang/parser/GeneratedParserUtilBase$Parser;)V
25+
public final fun setCreateElement (Lkotlin/jvm/functions/Function1;)V
26+
public final fun setOverrides (Lcom/intellij/lang/parser/GeneratedParserUtilBase$Parser;)V
27+
}
28+
129
public final class app/softwork/sqldelight/postgresdialect/PostgresNativeDialect : app/cash/sqldelight/dialect/api/SqlDelightDialect {
230
public fun <init> ()V
331
public fun getAllowsReferenceCycles ()Z
@@ -12,3 +40,42 @@ public final class app/softwork/sqldelight/postgresdialect/PostgresNativeDialect
1240
public fun typeResolver (Lapp/cash/sqldelight/dialect/api/TypeResolver;)Lapp/cash/sqldelight/dialect/api/TypeResolver;
1341
}
1442

43+
public abstract interface class app/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeBindParameter : com/alecstrong/sql/psi/core/psi/SqlBindParameter {
44+
}
45+
46+
public abstract interface class app/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeOverrides : com/alecstrong/sql/psi/core/psi/SqlCompositeElement {
47+
public abstract fun getBindParameter ()Lapp/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeBindParameter;
48+
}
49+
50+
public abstract interface class app/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeTypes {
51+
public static final field BIND_PARAMETER Lcom/intellij/psi/tree/IElementType;
52+
public static final field DEFAULT Lcom/intellij/psi/tree/IElementType;
53+
public static final field OVERRIDES Lcom/intellij/psi/tree/IElementType;
54+
}
55+
56+
public class app/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeTypes$Factory {
57+
public fun <init> ()V
58+
public static fun createElement (Lcom/intellij/lang/ASTNode;)Lcom/intellij/psi/PsiElement;
59+
}
60+
61+
public class app/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeVisitor : com/intellij/psi/PsiElementVisitor {
62+
public fun <init> ()V
63+
public fun visitBindParameter (Lapp/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeBindParameter;)V
64+
public fun visitOverrides (Lapp/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeOverrides;)V
65+
public fun visitSqlBindParameter (Lcom/alecstrong/sql/psi/core/psi/SqlBindParameter;)V
66+
public fun visitSqlCompositeElement (Lcom/alecstrong/sql/psi/core/psi/SqlCompositeElement;)V
67+
}
68+
69+
public class app/softwork/sqldelight/postgresdialect/psi/impl/PostgreSqlNativeBindParameterImpl : app/softwork/sqldelight/postgresdialect/BindParameterMixin, app/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeBindParameter {
70+
public fun <init> (Lcom/intellij/lang/ASTNode;)V
71+
public fun accept (Lapp/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeVisitor;)V
72+
public fun accept (Lcom/intellij/psi/PsiElementVisitor;)V
73+
}
74+
75+
public class app/softwork/sqldelight/postgresdialect/psi/impl/PostgreSqlNativeOverridesImpl : com/alecstrong/sql/psi/core/psi/SqlCompositeElementImpl, app/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeOverrides {
76+
public fun <init> (Lcom/intellij/lang/ASTNode;)V
77+
public fun accept (Lapp/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeVisitor;)V
78+
public fun accept (Lcom/intellij/psi/PsiElementVisitor;)V
79+
public fun getBindParameter ()Lapp/softwork/sqldelight/postgresdialect/psi/PostgreSqlNativeBindParameter;
80+
}
81+

postgres-native-sqldelight-dialect/build.gradle.kts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ plugins {
44
kotlin("jvm")
55
`maven-publish`
66
id("com.github.johnrengelman.shadow")
7+
id("com.alecstrong.grammar.kit.composer")
78
}
89

910
java {
@@ -15,18 +16,25 @@ repositories {
1516
mavenCentral()
1617
maven(url = "https://www.jetbrains.com/intellij-repository/releases")
1718
maven(url = "https://cache-redirector.jetbrains.com/intellij-dependencies")
19+
maven(url = "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-ide-plugin-dependencies/")
20+
maven(url = "https://maven.pkg.jetbrains.space/public/p/ktor/eap")
21+
}
22+
23+
val idea = "211.7628.21"
24+
25+
grammarKit {
26+
intellijRelease.set(idea)
1827
}
1928

2029
dependencies {
2130
api("app.cash.sqldelight:postgresql-dialect:2.0.0-alpha04")
2231

2332
compileOnly("app.cash.sqldelight:dialect-api:2.0.0-alpha04")
2433

25-
val idea = "222.4167.33"
26-
compileOnly("com.jetbrains.intellij.platform:core-impl:$idea")
34+
compileOnly("com.jetbrains.intellij.platform:core-ui:$idea")
2735
compileOnly("com.jetbrains.intellij.platform:lang-impl:$idea")
2836

29-
testImplementation("com.jetbrains.intellij.platform:core-impl:$idea")
37+
testImplementation("com.jetbrains.intellij.platform:core-ui:$idea")
3038
testImplementation("com.jetbrains.intellij.platform:lang-impl:$idea")
3139
testImplementation(kotlin("test-junit"))
3240
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package app.softwork.sqldelight.postgresdialect
2+
3+
import app.cash.sqldelight.dialect.grammar.mixins.BindParameterMixin
4+
import com.intellij.lang.*
5+
6+
public abstract class BindParameterMixin(node: ASTNode) : BindParameterMixin(node) {
7+
override fun replaceWith(isAsync: Boolean, index: Int): String = "$$index"
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
// Specify the parent parser.
3+
overrides="com.alecstrong.sql.psi.core.SqlParser"
4+
elementTypeClass = "com.alecstrong.sql.psi.core.SqlElementType"
5+
6+
implements="com.alecstrong.sql.psi.core.psi.SqlCompositeElement"
7+
extends="com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl"
8+
psiClassPrefix = "PostgreSqlNative"
9+
10+
parserImports=[
11+
"static com.alecstrong.sql.psi.core.psi.SqlTypes.DEFAULT"
12+
]
13+
}
14+
overrides ::= bind_parameter
15+
16+
bind_parameter ::= DEFAULT | ( '?' | ':' {identifier} ) {
17+
mixin = "app.softwork.sqldelight.postgresdialect.BindParameterMixin"
18+
extends = "com.alecstrong.sql.psi.core.psi.impl.SqlBindParameterImpl"
19+
implements = "com.alecstrong.sql.psi.core.psi.SqlBindParameter"
20+
override = true
21+
}

postgres-native-sqldelight-dialect/src/main/kotlin/app/softwork/sqldelight/postgresdialect/PostgresNativeDialect.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,24 @@ package app.softwork.sqldelight.postgresdialect
22

33
import app.cash.sqldelight.dialect.api.*
44
import app.cash.sqldelight.dialects.postgresql.*
5+
import app.cash.sqldelight.dialects.postgresql.grammar.*
56
import app.cash.sqldelight.dialects.postgresql.grammar.psi.*
7+
import com.alecstrong.sql.psi.core.*
68
import com.alecstrong.sql.psi.core.psi.*
79
import com.squareup.kotlinpoet.*
810

911
public class PostgresNativeDialect : SqlDelightDialect by PostgreSqlDialect() {
12+
13+
override fun setup() {
14+
SqlParserUtil.reset()
15+
16+
PostgreSqlParserUtil.reset()
17+
PostgreSqlParserUtil.overrideSqlParser()
18+
19+
PostgreSqlNativeParserUtil.reset()
20+
PostgreSqlNativeParserUtil.overrideSqlParser()
21+
}
22+
1023
override val runtimeTypes: RuntimeTypes = RuntimeTypes(
1124
cursorType = ClassName("app.softwork.sqldelight.postgresdriver", "PostgresCursor"),
1225
preparedStatementType = ClassName("app.softwork.sqldelight.postgresdriver", "PostgresPreparedStatement")

postgres-native-sqldelight-driver/src/commonMain/kotlin/app/softwork/sqldelight/postgresdriver/PostgresNativeDriver.kt

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public class PostgresNativeDriver(private var conn: CPointer<PGconn>) : SqlDrive
5353
PQprepare(
5454
conn,
5555
stmtName = identifier.toString(),
56-
query = sql.replaceQuestionMarks(),
56+
query = sql,
5757
nParams = parameters,
5858
paramTypes = preparedStatement?.types?.refTo(0)
5959
).check(conn).clear()
@@ -73,7 +73,7 @@ public class PostgresNativeDriver(private var conn: CPointer<PGconn>) : SqlDrive
7373
memScoped {
7474
PQexecParams(
7575
conn,
76-
command = sql.replaceQuestionMarks(),
76+
command = sql,
7777
nParams = parameters,
7878
paramValues = preparedStatement?.values(this),
7979
paramFormats = preparedStatement?.formats?.refTo(0),
@@ -125,7 +125,7 @@ public class PostgresNativeDriver(private var conn: CPointer<PGconn>) : SqlDrive
125125
PQprepare(
126126
conn,
127127
stmtName = identifier.toString(),
128-
query = "$cursor ${sql.replaceQuestionMarks()}",
128+
query = "$cursor $sql",
129129
nParams = parameters,
130130
paramTypes = preparedStatement?.types?.refTo(0)
131131
).check(conn).clear()
@@ -147,7 +147,7 @@ public class PostgresNativeDriver(private var conn: CPointer<PGconn>) : SqlDrive
147147
memScoped {
148148
PQexecParams(
149149
conn,
150-
command = "$cursor ${sql.replaceQuestionMarks()}",
150+
command = "$cursor $sql",
151151
nParams = parameters,
152152
paramValues = preparedStatement?.values(this),
153153
paramLengths = preparedStatement?.lengths?.refTo(0),
@@ -162,17 +162,9 @@ public class PostgresNativeDriver(private var conn: CPointer<PGconn>) : SqlDrive
162162
return QueryResult.Value(value = value)
163163
}
164164

165-
private fun String.replaceQuestionMarks(): String {
166-
var index = 1
167-
return replace(replaceQuestionMarks) {
168-
"$${index++}"
169-
}
170-
}
171-
172165
internal companion object {
173166
const val TEXT_RESULT_FORMAT = 0
174167
const val BINARY_RESULT_FORMAT = 1
175-
val replaceQuestionMarks = "\\?".toRegex()
176168
}
177169

178170
override fun close() {

testing/src/commonMain/sqldelight/app/softwork/sqldelight/postgresdriver/Foo.sq

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
create:
2-
INSERT INTO foo VALUES ?;
2+
INSERT INTO foo VALUES (?, ?, ?, ?, ?, ?, ?, ?);
33

44
get:
55
SELECT * FROM foo;

testing/src/commonTest/kotlin/app/softwork/sqldelight/postgresdriver/PostgresNativeDriverTest.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,16 @@ class PostgresNativeDriverTest {
2929
interval = 42.seconds,
3030
uuid = UUID.NIL
3131
)
32-
queries.create(foo)
32+
queries.create(
33+
a = foo.a,
34+
b = foo.b,
35+
date = foo.date,
36+
time = foo.time,
37+
timestamp = foo.timestamp,
38+
instant = foo.instant,
39+
interval = foo.interval,
40+
uuid = foo.uuid
41+
)
3342
assertEquals(foo, queries.get().executeAsOne())
3443
}
3544

0 commit comments

Comments
 (0)