You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by do...@apache.org on 2024/12/07 18:25:06 UTC
(spark) branch branch-3.5 updated: [SPARK-49695][SQL][3.5] Postgres fix xor push-down
This is an automated email from the ASF dual-hosted git repository.
dongjoon pushed a commit to branch branch-3.5
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-3.5 by this push:
new 305d2a0aa48c [SPARK-49695][SQL][3.5] Postgres fix xor push-down
305d2a0aa48c is described below
commit 305d2a0aa48cf5b470f75b02677e7761dca2a0e1
Author: Andrej Gobeljić <an...@databricks.com>
AuthorDate: Sat Dec 7 10:24:53 2024 -0800
[SPARK-49695][SQL][3.5] Postgres fix xor push-down
### What changes were proposed in this pull request?
Backport of the https://github.com/apache/spark/pull/48144
This PR fixes the pushdown of ^ operator (XOR operator) for Postgres. Those two databases use this as exponent, rather then bitwise xor.
Fix is consisted of overriding the SQLExpressionBuilder to replace the '^' character with '#'.
### Why are the changes needed?
Result is incorrect.
### Does this PR introduce _any_ user-facing change?
Yes. The user will now have a proper translation of the ^ operator.
### How was this patch tested?
### Was this patch authored or co-authored using generative AI tooling?
No.
Closes #49071 from andrej-db/PGXORBackport.
Lead-authored-by: Andrej Gobeljić <an...@databricks.com>
Co-authored-by: andrej-gobeljic_data <an...@databricks.com>
Signed-off-by: Dongjoon Hyun <do...@apache.org>
---
.../sql/jdbc/v2/PostgresIntegrationSuite.scala | 10 ++++++++++
.../org/apache/spark/sql/jdbc/PostgresDialect.scala | 21 ++++++++++++++++++++-
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/connector/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/v2/PostgresIntegrationSuite.scala b/connector/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/v2/PostgresIntegrationSuite.scala
index 7fef3ccd6b3f..b0edac3fcdd1 100644
--- a/connector/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/v2/PostgresIntegrationSuite.scala
+++ b/connector/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/v2/PostgresIntegrationSuite.scala
@@ -22,6 +22,7 @@ import java.sql.Connection
import org.apache.spark.SparkConf
import org.apache.spark.sql.AnalysisException
import org.apache.spark.sql.catalyst.analysis.TableAlreadyExistsException
+import org.apache.spark.sql.execution.FilterExec
import org.apache.spark.sql.execution.datasources.v2.jdbc.JDBCTableCatalog
import org.apache.spark.sql.jdbc.DatabaseOnDocker
import org.apache.spark.sql.types._
@@ -123,4 +124,13 @@ class PostgresIntegrationSuite extends DockerJDBCIntegrationV2Suite with V2JDBCT
)
}
}
+
+ test("SPARK-49695: Postgres fix xor push-down") {
+ val df = spark.sql(s"select dept, name from $catalogName.employee where dept ^ 6 = 0")
+ val rows = df.collect()
+ assert(!df.queryExecution.sparkPlan.exists(_.isInstanceOf[FilterExec]))
+ assert(rows.length == 1)
+ assert(rows(0).getInt(0) === 6)
+ assert(rows(0).getString(1) === "jen")
+ }
}
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala
index f8f72d88589e..dd4545bc41b4 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala
@@ -22,11 +22,13 @@ import java.time.{LocalDateTime, ZoneOffset}
import java.util
import java.util.Locale
+import scala.util.control.NonFatal
+
import org.apache.spark.sql.AnalysisException
import org.apache.spark.sql.catalyst.SQLConfHelper
import org.apache.spark.sql.catalyst.analysis.{IndexAlreadyExistsException, NonEmptyNamespaceException, NoSuchIndexException}
import org.apache.spark.sql.connector.catalog.Identifier
-import org.apache.spark.sql.connector.expressions.NamedReference
+import org.apache.spark.sql.connector.expressions.{Expression, NamedReference}
import org.apache.spark.sql.errors.QueryCompilationErrors
import org.apache.spark.sql.execution.datasources.jdbc.{JDBCOptions, JdbcUtils}
import org.apache.spark.sql.execution.datasources.v2.TableSampleInfo
@@ -258,6 +260,23 @@ private object PostgresDialect extends JdbcDialect with SQLConfHelper {
}
}
+ class PostgresSQLBuilder extends JDBCSQLBuilder {
+ override def visitBinaryArithmetic(name: String, l: String, r: String): String = {
+ l + " " + name.replace('^', '#') + " " + r
+ }
+ }
+
+ override def compileExpression(expr: Expression): Option[String] = {
+ val postgresSQLBuilder = new PostgresSQLBuilder()
+ try {
+ Some(postgresSQLBuilder.build(expr))
+ } catch {
+ case NonFatal(e) =>
+ logWarning("Error occurs while compiling V2 expression", e)
+ None
+ }
+ }
+
override def supportsLimit: Boolean = true
override def supportsOffset: Boolean = true
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org