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

yanxinyi pushed a commit to branch 4.x
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/4.x by this push:
     new 665076c  PHOENIX-5898 Phoenix function CURRENT_TIME() returns wrong 
result when view indexes are used.
665076c is described below

commit 665076cd212acc5a8acba62bfc436840942c0ed9
Author: Jacob Isaac <jis...@salesforce.com>
AuthorDate: Wed Jun 3 10:42:06 2020 -0700

    PHOENIX-5898 Phoenix function CURRENT_TIME() returns wrong result when view 
indexes are used.
    
    Signed-off-by: Xinyi Yan <yanxi...@apache.org>
---
 .../phoenix/end2end/TenantSpecificViewIndexIT.java | 79 ++++++++++++++++++++++
 .../org/apache/phoenix/schema/MetaDataClient.java  |  2 +-
 2 files changed, 80 insertions(+), 1 deletion(-)

diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java
 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java
index 37a31e3..e474f69 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java
@@ -29,6 +29,7 @@ import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.sql.Statement;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -341,4 +342,82 @@ public class TenantSpecificViewIndexIT extends 
BaseTenantSpecificViewIndexIT {
             assertEquals(String.format(expectedPlanFormat, "2012-10-21", 
"2016-01-01"), QueryUtil.getExplainPlan(rs));
         }
     }
+
+    @Test public void testCurrentTimeWithViewIndexes() throws Exception {
+
+        String baseName = generateUniqueName();
+        String baseTable = String.format("BT_%s", baseName);
+        String globalView = String.format("GV_%s", baseName);
+        String tenantView = String.format("TV_%s", baseName);
+        String viewIndex = String.format("IDX_%s", globalView);
+        String tenant = "00D0t000T000001";
+
+        String tenantConnectionUrl = String.format("%s;%s=%s", getUrl(), 
TENANT_ID_ATTRIB, tenant);
+        String BASE_TABLE_TEMPLATE =
+                "CREATE TABLE IF NOT EXISTS %s " + " (TENANT_ID CHAR(15) NOT 
NULL, "
+                        + " KP CHAR(3) NOT NULL, " + " COL1 VARCHAR,COL2 
VARCHAR,COL3 VARCHAR "
+                        + " CONSTRAINT PK PRIMARY KEY (TENANT_ID, KP)) "
+                        + " MULTI_TENANT=true, COLUMN_ENCODED_BYTES = 0";
+
+        String GLOBAL_VIEW_TEMPLATE =
+                "CREATE VIEW IF NOT EXISTS %s "
+                        + " (GID CHAR(15) NOT NULL, COL4 VARCHAR, COL5 
VARCHAR, COL6 VARCHAR "
+                        + " CONSTRAINT pk PRIMARY KEY (GID)) "
+                        + " AS SELECT * FROM %s WHERE KP = 'A'";
+
+        String TENANT_VIEW_TEMPLATE = "CREATE VIEW IF NOT EXISTS %s AS SELECT 
* FROM %s";
+
+        String INDEX_TEMPLATE = "CREATE INDEX IF NOT EXISTS %s ON %s(%s) 
INCLUDE (%s)";
+
+        try (Connection globalConn = DriverManager.getConnection(getUrl());
+                Connection tenantConnection = 
DriverManager.getConnection(tenantConnectionUrl)) {
+
+            
globalConn.createStatement().execute(String.format(BASE_TABLE_TEMPLATE, 
baseTable));
+            globalConn.createStatement()
+                    .execute(String.format(GLOBAL_VIEW_TEMPLATE, globalView, 
baseTable));
+            globalConn.createStatement()
+                    .execute(String.format(INDEX_TEMPLATE, viewIndex, 
globalView, "COL4", "COL6"));
+            tenantConnection.createStatement()
+                    .execute(String.format(TENANT_VIEW_TEMPLATE, tenantView, 
globalView));
+
+            try (Statement stmt = tenantConnection.createStatement()) {
+                stmt.execute(String.format("UPSERT INTO %s 
(GID,COL1,COL2,COL3,COL4,COL5,COL6) "
+                        + "VALUES('gv1', 'a1','b1','c1','d41','e51','f61')", 
tenantView));
+                tenantConnection.commit();
+            }
+        }
+
+        try (Connection readConnection = 
DriverManager.getConnection(tenantConnectionUrl)) {
+            // SQL where index is selected
+            String
+                    planWithIndex =
+                    String.format(
+                            "SELECT to_number(current_time()) as t, col6 from 
%s where col4 = 'd41'",
+                            tenantView);
+
+            // SQL where index is not selected
+            String
+                    planNoIndex =
+                    String.format(
+                            "SELECT to_number(current_time()) as t, col6 from 
%s where col5 = 'e51'",
+                            tenantView);
+
+            try (Statement stmt = readConnection.createStatement()) {
+                ResultSet rs = stmt.executeQuery(planWithIndex);
+                rs.next();
+                long time = rs.getLong(1);
+                // current time returns proper time
+                assertTrue(time != -1);
+            }
+
+            try (Statement stmt = readConnection.createStatement()) {
+                ResultSet rs = stmt.executeQuery(planNoIndex);
+                rs.next();
+                long time = rs.getLong(1);
+                // current time returns proper time
+                assertTrue(time != -1);
+            }
+
+        }
+    }
 }
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java 
b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
index 15e3145..52a053d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
@@ -631,7 +631,7 @@ public class MetaDataClient {
                     tableRef = connection.getTableRef(new PTableKey(tenantId, 
fullTableName));
                     table = tableRef.getTable();
                     return new 
MetaDataMutationResult(MutationCode.TABLE_ALREADY_EXISTS,
-                            QueryConstants.UNSET_TIMESTAMP, table);
+                            tableRef.getResolvedTimeStamp(), table);
                 } catch (TableNotFoundException e) {
                     // reset the result as we looked up the parent view 
                     return new 
MetaDataMutationResult(MutationCode.TABLE_NOT_FOUND,

Reply via email to