From 2c8bb45710d2ae1bd2601d3e5e0ad12e78dd5842 Mon Sep 17 00:00:00 2001 From: Andrew Sumskoy Date: Tue, 22 Aug 2017 14:52:11 +0300 Subject: [PATCH] fix wrong type matching for postgres in query statements, fix postgres performance degradation on sql like 'select ... where in ({1,2,3}::numeric[])' --- .../async/db/postgresql/PostgreSQLConnection.scala | 4 +++- .../async/db/postgresql/column/ColumnTypes.scala | 2 ++ .../column/PostgreSQLColumnEncoderRegistry.scala | 12 ++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/PostgreSQLConnection.scala b/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/PostgreSQLConnection.scala index 470700c4..e6eb11a9 100644 --- a/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/PostgreSQLConnection.scala +++ b/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/PostgreSQLConnection.scala @@ -119,7 +119,9 @@ class PostgreSQLConnection val promise = Promise[QueryResult]() this.setQueryPromise(promise) - val holder = this.parsedStatements.getOrElseUpdate(query, + val statementKey = query + "|" + values.map(value => encoderRegistry.kindOf(value)).mkString(",") + + val holder = this.parsedStatements.getOrElseUpdate(statementKey, new PreparedStatementHolder( query, preparedStatementsCounter.incrementAndGet )) if (holder.paramsCount != values.length) { diff --git a/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/column/ColumnTypes.scala b/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/column/ColumnTypes.scala index 93fef482..918f9f3c 100644 --- a/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/column/ColumnTypes.scala +++ b/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/column/ColumnTypes.scala @@ -20,6 +20,8 @@ object ColumnTypes { final val Untyped = 0 final val Bigserial = 20 final val BigserialArray = 1016 + final val Bigint = 20 + final val BigintArray = 1016 final val Char = 18 final val CharArray = 1002 final val Smallint = 21 diff --git a/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/column/PostgreSQLColumnEncoderRegistry.scala b/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/column/PostgreSQLColumnEncoderRegistry.scala index c9f95f43..2212e1d3 100644 --- a/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/column/PostgreSQLColumnEncoderRegistry.scala +++ b/postgresql-async/src/main/scala/com/github/mauricio/async/db/postgresql/column/PostgreSQLColumnEncoderRegistry.scala @@ -31,14 +31,14 @@ object PostgreSQLColumnEncoderRegistry { class PostgreSQLColumnEncoderRegistry extends ColumnEncoderRegistry { private val classesSequence_ : List[(Class[_], (ColumnEncoder, Int))] = List( - classOf[Int] -> (IntegerEncoderDecoder -> ColumnTypes.Numeric), - classOf[java.lang.Integer] -> (IntegerEncoderDecoder -> ColumnTypes.Numeric), + classOf[Int] -> (IntegerEncoderDecoder -> ColumnTypes.Integer), + classOf[java.lang.Integer] -> (IntegerEncoderDecoder -> ColumnTypes.Integer), - classOf[java.lang.Short] -> (ShortEncoderDecoder -> ColumnTypes.Numeric), - classOf[Short] -> (ShortEncoderDecoder -> ColumnTypes.Numeric), + classOf[java.lang.Short] -> (ShortEncoderDecoder -> ColumnTypes.Integer), + classOf[Short] -> (ShortEncoderDecoder -> ColumnTypes.Integer), - classOf[Long] -> (LongEncoderDecoder -> ColumnTypes.Numeric), - classOf[java.lang.Long] -> (LongEncoderDecoder -> ColumnTypes.Numeric), + classOf[Long] -> (LongEncoderDecoder -> ColumnTypes.Bigint), + classOf[java.lang.Long] -> (LongEncoderDecoder -> ColumnTypes.Bigint), classOf[String] -> (StringEncoderDecoder -> ColumnTypes.Varchar), classOf[java.lang.String] -> (StringEncoderDecoder -> ColumnTypes.Varchar),