This is an automated email from the ASF dual-hosted git repository.

jisaac pushed a commit to branch 5.1
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/5.1 by this push:
     new c97d584497 PHOENIX-6662 Failed to delete when PK with DESC with IN 
clause (#1509)
c97d584497 is described below

commit c97d584497b0821db49dc0f9b7bb9daf6b8be287
Author: Jacob Isaac <[email protected]>
AuthorDate: Thu Sep 29 09:11:21 2022 -0700

    PHOENIX-6662 Failed to delete when PK with DESC with IN clause (#1509)
    
    Signed-off-by: Gokcen Iskender <[email protected]>
    
    Signed-off-by: Gokcen Iskender <[email protected]>
    Co-authored-by: Gokcen Iskender <[email protected]>
---
 .../apache/phoenix/end2end/SkipScanQueryIT.java    | 153 +++++++++++++++++++++
 .../org/apache/phoenix/compile/WhereOptimizer.java |  13 +-
 .../java/org/apache/phoenix/query/KeyRange.java    |   2 +-
 3 files changed, 161 insertions(+), 7 deletions(-)

diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SkipScanQueryIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SkipScanQueryIT.java
index 74c93006dd..68abb0df7a 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SkipScanQueryIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SkipScanQueryIT.java
@@ -22,6 +22,7 @@ import static 
org.apache.phoenix.util.TestUtil.assertResultSet;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.StringReader;
 import java.math.BigDecimal;
@@ -813,6 +814,158 @@ public class SkipScanQueryIT extends 
ParallelStatsDisabledIT {
         }
     }
 
+    @Test
+    public void testRvcInListDelete() throws Exception {
+        String tableName = "TBL_" + generateUniqueName();
+        String viewName = "VW_" + generateUniqueName();
+        String baseTableDDL = "CREATE TABLE IF NOT EXISTS "+ tableName + " 
(\n" +
+                "    ORG_ID CHAR(15) NOT NULL,\n" +
+                "    KEY_PREFIX CHAR(3) NOT NULL,\n" +
+                "    DATE1 DATE,\n" +
+                "    CONSTRAINT PK PRIMARY KEY (\n" +
+                "        ORG_ID,\n" +
+                "        KEY_PREFIX\n" +
+                "    )\n" +
+                ") VERSIONS=1, MULTI_TENANT=true, 
IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN, COLUMN_ENCODED_BYTES=0";
+        String globalViewDDL = "CREATE VIEW  " + viewName +  "(\n" +
+                "    DOUBLE1 DECIMAL(12, 3) NOT NULL,\n" +
+                "    INT1 BIGINT NOT NULL,\n" +
+                "    DATE_TIME1 DATE,\n" +
+                "    COS_ID CHAR(15),\n" +
+                "    TEXT1 VARCHAR,\n" +
+                "    CONSTRAINT PKVIEW PRIMARY KEY\n" +
+                "    (\n" +
+                "        DOUBLE1 DESC, INT1\n" +
+                "    )\n" +
+                ")\n" +
+                "AS SELECT * FROM " + tableName + " WHERE KEY_PREFIX = '08K'";
+        String tenantViewName = tableName + ".\"08K\"";
+        String tenantViewDDL = "CREATE VIEW " + tenantViewName + " AS SELECT * 
FROM " + viewName;
+        createTestTable(getUrl(), baseTableDDL);
+        createTestTable(getUrl(), globalViewDDL);
+
+        Properties tenantProps = new Properties();
+        tenantProps.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, "tenant1");
+        String upsertOne = "UPSERT INTO " + tenantViewName + " (DOUBLE1, INT1) 
VALUES (10.0,10)";
+        String upsertTwo = "UPSERT INTO " + tenantViewName + " (DOUBLE1, INT1) 
VALUES (20.0,20)";
+        String deletion = "DELETE FROM " + tenantViewName + " WHERE 
(DOUBLE1,INT1) IN ((10.0, 10),(20.0, 20))";
+        String deletionNotPkOrder = "DELETE FROM " + tenantViewName + " WHERE 
(INT1,DOUBLE1) IN ((10, 10.0),(20, 20.0))";
+
+        try (Connection tenantConn = DriverManager.getConnection(getUrl(), 
tenantProps)) {
+            tenantConn.createStatement().execute(tenantViewDDL);
+            tenantConn.createStatement().execute(upsertOne);
+            tenantConn.createStatement().execute(upsertTwo);
+            tenantConn.commit();
+
+            ResultSet rs = tenantConn.createStatement().executeQuery("SELECT 
COUNT(*) FROM " + tenantViewName);
+            if (rs.next()) {
+                int count = rs.getInt(1);
+                assertEquals(2, count);
+            } else {
+                fail();
+            }
+            tenantConn.createStatement().execute(deletion);
+            tenantConn.commit();
+            rs = tenantConn.createStatement().executeQuery("SELECT COUNT(*) 
FROM " + tenantViewName);
+            if (rs.next()) {
+                int count = rs.getInt(1);
+                assertEquals(0, count);
+            } else {
+                fail();
+            }
+
+            tenantConn.createStatement().execute(upsertOne);
+            tenantConn.createStatement().execute(upsertTwo);
+            tenantConn.commit();
+            tenantConn.createStatement().execute(deletionNotPkOrder);
+            tenantConn.commit();
+            rs = tenantConn.createStatement().executeQuery("SELECT COUNT(*) 
FROM " + tenantViewName);
+            if (rs.next()) {
+                int count = rs.getInt(1);
+                assertEquals(0, count);
+            } else {
+                fail();
+            }
+        }
+
+    }
+
+    @Test
+    public void testRvcInListDeleteBothDesc() throws Exception {
+        String tableName = "TBL_" + generateUniqueName();
+        String viewName = "VW_" + generateUniqueName();
+        String baseTableDDL = "CREATE TABLE IF NOT EXISTS "+ tableName + " 
(\n" +
+                "    ORG_ID CHAR(15) NOT NULL,\n" +
+                "    KEY_PREFIX CHAR(3) NOT NULL,\n" +
+                "    DATE1 DATE,\n" +
+                "    CONSTRAINT PK PRIMARY KEY (\n" +
+                "        ORG_ID,\n" +
+                "        KEY_PREFIX\n" +
+                "    )\n" +
+                ") VERSIONS=1, MULTI_TENANT=true, 
IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN, COLUMN_ENCODED_BYTES=0";
+        String globalViewDDL = "CREATE VIEW  " + viewName +  "(\n" +
+                "    DOUBLE1 DECIMAL(12, 3) NOT NULL,\n" +
+                "    INT1 BIGINT NOT NULL,\n" +
+                "    DATE_TIME1 DATE,\n" +
+                "    COS_ID CHAR(15),\n" +
+                "    TEXT1 VARCHAR,\n" +
+                "    CONSTRAINT PKVIEW PRIMARY KEY\n" +
+                "    (\n" +
+                "        DOUBLE1 DESC, INT1 DESC\n" +
+                "    )\n" +
+                ")\n" +
+                "AS SELECT * FROM " + tableName + " WHERE KEY_PREFIX = '08K'";
+        String tenantViewName = tableName + ".\"08K\"";
+        String tenantViewDDL = "CREATE VIEW " + tenantViewName + " AS SELECT * 
FROM " + viewName;
+        createTestTable(getUrl(), baseTableDDL);
+        createTestTable(getUrl(), globalViewDDL);
+
+        Properties tenantProps = new Properties();
+        tenantProps.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, "tenant1");
+        String upsertOne = "UPSERT INTO " + tenantViewName + " (DOUBLE1, INT1) 
VALUES (10.0,10)";
+        String upsertTwo = "UPSERT INTO " + tenantViewName + " (DOUBLE1, INT1) 
VALUES (20.0,20)";
+        String deletion = "DELETE FROM " + tenantViewName + " WHERE 
(DOUBLE1,INT1) IN ((10.0, 10),(20.0, 20))";
+        String deletionNotPkOrder = "DELETE FROM " + tenantViewName + " WHERE 
(INT1,DOUBLE1) IN ((10, 10.0),(20, 20.0))";
+
+        try (Connection tenantConn = DriverManager.getConnection(getUrl(), 
tenantProps)) {
+            tenantConn.createStatement().execute(tenantViewDDL);
+            tenantConn.createStatement().execute(upsertOne);
+            tenantConn.createStatement().execute(upsertTwo);
+            tenantConn.commit();
+
+            ResultSet rs = tenantConn.createStatement().executeQuery("SELECT 
COUNT(*) FROM " + tenantViewName);
+            if (rs.next()) {
+                int count = rs.getInt(1);
+                assertEquals(2, count);
+            } else {
+                fail();
+            }
+            tenantConn.createStatement().execute(deletion);
+            tenantConn.commit();
+            rs = tenantConn.createStatement().executeQuery("SELECT COUNT(*) 
FROM " + tenantViewName);
+            if (rs.next()) {
+                int count = rs.getInt(1);
+                assertEquals(0, count);
+            } else {
+                fail();
+            }
+
+            tenantConn.createStatement().execute(upsertOne);
+            tenantConn.createStatement().execute(upsertTwo);
+            tenantConn.commit();
+            tenantConn.createStatement().execute(deletionNotPkOrder);
+            tenantConn.commit();
+            rs = tenantConn.createStatement().executeQuery("SELECT COUNT(*) 
FROM " + tenantViewName);
+            if (rs.next()) {
+                int count = rs.getInt(1);
+                assertEquals(0, count);
+            } else {
+                fail();
+            }
+        }
+
+    }
+
     @Test
     public void testKeyRangesContainsAllValues() throws Exception {
         String tableName = generateUniqueName();
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java 
b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
index 6017944cf5..584e96bb42 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
@@ -249,7 +249,7 @@ public class WhereOptimizer {
                         schema.getField(slot.getPKPosition() + 
slotOffset).getSortOrder();
                 if (prevSortOrder == null)  {
                     prevSortOrder = sortOrder;
-                } else if (prevSortOrder != sortOrder) {
+                } else if (prevSortOrder != sortOrder || (prevSortOrder == 
SortOrder.DESC && isInList)) {
                     //Consider the Universe of keys to be [0,7]+ on the 
leading column A
                     // and [0,7]+ on trailing column B, with a padbyte of 0 
for ASC and 7 for DESC
                     //if our key range for ASC keys is leading [2,*] and 
trailing [3,*],
@@ -316,7 +316,7 @@ public class WhereOptimizer {
             } else {
                 if (schema.getField(
                        slot.getPKPosition() + slotOffset - 1).getSortOrder() 
== SortOrder.DESC) {
-                    keyRanges = invertKeyRanges(keyRanges);
+                   keyRanges = invertKeyRanges(keyRanges);
                 }
                 pkPos = slot.getPKPosition() + slotOffset;
                 slotSpanArray[cnf.size()] = clipLeftSpan-1;
@@ -2241,10 +2241,11 @@ public class WhereOptimizer {
                     // for the non-equality cases return actual sort order
                     //This work around should work
                     // but a more general approach can be taken.
-                    if(rvcElementOp == CompareOp.EQUAL ||
-                            rvcElementOp == CompareOp.NOT_EQUAL){
-                        return SortOrder.ASC;
-                    }
+                    //This optimization causes PHOENIX-6662 (when desc pk used 
with in clause)
+//                    if(rvcElementOp == CompareOp.EQUAL ||
+//                            rvcElementOp == CompareOp.NOT_EQUAL){
+//                        return SortOrder.ASC;
+//                    }
                     return childPart.getColumn().getSortOrder();
                 }
 
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/KeyRange.java 
b/phoenix-core/src/main/java/org/apache/phoenix/query/KeyRange.java
index 686c2798ed..e154480743 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/query/KeyRange.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/query/KeyRange.java
@@ -615,7 +615,7 @@ public class KeyRange implements Writable {
         }
         return result;
     }
-    
+
     public KeyRange invert() {
         // these special ranges do not get inverted because we
         // represent NULL in the same way for ASC and DESC.

Reply via email to