Add postgresql dialect
This commit is contained in:
parent
ed736783fc
commit
fefcf86b8c
2 changed files with 60 additions and 1 deletions
54
src/main/scala/minisql/context/sql/PostgresDialect.scala
Normal file
54
src/main/scala/minisql/context/sql/PostgresDialect.scala
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
package minisql.context.sql.idiom
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
|
|
||||||
|
import minisql.ast.*
|
||||||
|
import minisql.{NamingStrategy}
|
||||||
|
import minisql.context.CanReturnClause
|
||||||
|
import minisql.idiom.StatementInterpolator.*
|
||||||
|
|
||||||
|
trait PostgresDialect
|
||||||
|
extends SqlIdiom
|
||||||
|
with QuestionMarkBindVariables
|
||||||
|
with ConcatSupport
|
||||||
|
with OnConflictSupport
|
||||||
|
with CanReturnClause {
|
||||||
|
|
||||||
|
override def astTokenizer(using
|
||||||
|
astTokenizer: Tokenizer[Ast],
|
||||||
|
strategy: NamingStrategy
|
||||||
|
): Tokenizer[Ast] =
|
||||||
|
Tokenizer[Ast] {
|
||||||
|
case ListContains(ast, body) => stmt"${body.token} = ANY(${ast.token})"
|
||||||
|
case c: OnConflict => conflictTokenizer.token(c)
|
||||||
|
case ast => super.astTokenizer.token(ast)
|
||||||
|
}
|
||||||
|
|
||||||
|
override def operationTokenizer(using
|
||||||
|
astTokenizer: Tokenizer[Ast],
|
||||||
|
strategy: NamingStrategy
|
||||||
|
): Tokenizer[Operation] =
|
||||||
|
Tokenizer[Operation] {
|
||||||
|
case UnaryOperation(StringOperator.`toLong`, ast) =>
|
||||||
|
stmt"${scopedTokenizer(ast)}::bigint"
|
||||||
|
case UnaryOperation(StringOperator.`toInt`, ast) =>
|
||||||
|
stmt"${scopedTokenizer(ast)}::integer"
|
||||||
|
case operation => super.operationTokenizer.token(operation)
|
||||||
|
}
|
||||||
|
|
||||||
|
private[minisql] val preparedStatementId = new AtomicInteger
|
||||||
|
|
||||||
|
override def prepareForProbing(string: String) = {
|
||||||
|
var i = 0
|
||||||
|
val query = string.flatMap(x =>
|
||||||
|
if (x != '?') s"$x"
|
||||||
|
else {
|
||||||
|
i += 1
|
||||||
|
s"$$$i"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
s"PREPARE p${preparedStatementId.incrementAndGet.toString.token} AS $query"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object PostgresDialect extends PostgresDialect
|
|
@ -316,7 +316,12 @@ trait SqlIdiom extends Idiom {
|
||||||
case other => fail(s"Malformed or unsupported construct: $other.")
|
case other => fail(s"Malformed or unsupported construct: $other.")
|
||||||
}
|
}
|
||||||
|
|
||||||
given operationTokenizer(using
|
given (using
|
||||||
|
astTokenizer: Tokenizer[Ast],
|
||||||
|
strategy: NamingStrategy
|
||||||
|
): Tokenizer[Operation] = operationTokenizer
|
||||||
|
|
||||||
|
def operationTokenizer(using
|
||||||
astTokenizer: Tokenizer[Ast],
|
astTokenizer: Tokenizer[Ast],
|
||||||
strategy: NamingStrategy
|
strategy: NamingStrategy
|
||||||
): Tokenizer[Operation] = Tokenizer[Operation] {
|
): Tokenizer[Operation] = Tokenizer[Operation] {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue