You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by sk...@apache.org on 2021/01/08 21:21:51 UTC

[phoenix] branch 4.16 updated: PHOENIX-6148: [SchemaExtractionTool] DDL parsing exception in Phoenix in view name (Addendum)

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

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


The following commit(s) were added to refs/heads/4.16 by this push:
     new e493710  PHOENIX-6148: [SchemaExtractionTool] DDL parsing exception in Phoenix in view name (Addendum)
e493710 is described below

commit e493710aaa3be4ae3cbd03561670e1e99cc30964
Author: Swaroopa Kadam <s....@apache.org>
AuthorDate: Fri Jan 8 13:10:53 2021 -0800

    PHOENIX-6148: [SchemaExtractionTool] DDL parsing exception in Phoenix in view name (Addendum)
---
 .../java/org/apache/phoenix/util/SchemaUtil.java   | 38 ++++++++++++++++++++--
 .../phoenix/schema/SchemaExtractionToolIT.java     | 30 ++++++++++++++---
 2 files changed, 61 insertions(+), 7 deletions(-)

diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java
index c453dd1..6abc2a2 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java
@@ -1232,11 +1232,45 @@ public class SchemaUtil {
         return columnParseNode.getName();
     }
 
+    /**
+     * This function is needed so that SchemaExtractionTool returns a valid DDL with correct
+     * table/schema name that can be parsed
+     *
+     * @param pSchemaName
+     * @param pTableName
+     * @return quoted string if schema or table name has non-alphabetic characters in it.
+     */
     public static String getPTableFullNameWithQuotes(String pSchemaName, String pTableName) {
         String pTableFullName = getQualifiedTableName(pSchemaName, pTableName);
-        if(!(Character.isAlphabetic(pTableName.charAt(0)))) {
-            pTableFullName = pSchemaName+".\""+pTableName+"\"";
+        boolean tableNameNeedsQuotes = isQuotesNeeded(pTableName);
+        boolean schemaNameNeedsQuotes = isQuotesNeeded(pSchemaName);
+
+        if(schemaNameNeedsQuotes) {
+            pSchemaName= "\""+pSchemaName+"\"";
         }
+        if(tableNameNeedsQuotes) {
+            pTableName = "\""+pTableName+"\"";
+        }
+        if(tableNameNeedsQuotes || schemaNameNeedsQuotes) {
+            pTableFullName = pSchemaName + "." + pTableName;
+        }
+
         return pTableFullName;
     }
+
+    private static boolean isQuotesNeeded(String name) {
+        // first char numeric or non-underscore
+        if(!Character.isAlphabetic(name.charAt(0)) && name.charAt(0)!='_') {
+            return true;
+        }
+        // for all other chars
+        // ex. name like z@@ will need quotes whereas t0001 will not need quotes
+        for (int i=1; i<name.toCharArray().length; i++) {
+            char charAtI = name.charAt(i);
+            if (!(Character.isAlphabetic(charAtI)) && !Character.isDigit(charAtI) && charAtI != '_') {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git a/phoenix-tools/src/it/java/org/apache/phoenix/schema/SchemaExtractionToolIT.java b/phoenix-tools/src/it/java/org/apache/phoenix/schema/SchemaExtractionToolIT.java
index 8d0704b..4f9b11b 100644
--- a/phoenix-tools/src/it/java/org/apache/phoenix/schema/SchemaExtractionToolIT.java
+++ b/phoenix-tools/src/it/java/org/apache/phoenix/schema/SchemaExtractionToolIT.java
@@ -101,18 +101,38 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
                 + "v1 VARCHAR, v2 VARCHAR)"
                 + properties;
         String viewFullName = SchemaUtil.getQualifiedTableName(schemaName, viewName);
-        String viewFullName1 = SchemaUtil.getQualifiedTableName(schemaName, viewName+"1");
         String createView = "CREATE VIEW "+viewFullName + "(id1 BIGINT, id2 BIGINT NOT NULL, "
                 + "id3 VARCHAR NOT NULL CONSTRAINT PKVIEW PRIMARY KEY (id2, id3 DESC)) "
                 + "AS SELECT * FROM "+pTableFullName;
-        String createView1 = "CREATE VIEW "+viewFullName1 + "(id1 BIGINT, id2 BIGINT NOT NULL, "
+
+        List<String> queries = new ArrayList<String>(){};
+        queries.add(createTableStmt);
+        queries.add(createView);
+        String result = runSchemaExtractionTool(schemaName, viewName, null, queries);
+        Assert.assertEquals(createView.toUpperCase(), result.toUpperCase());
+
+    }
+
+    @Test
+    public void testCreateViewStatement_customName() throws Exception {
+        String tableName = generateUniqueName();
+        String schemaName = generateUniqueName();
+        String viewName = generateUniqueName()+"@@";
+        String properties = "TTL=2592000,IMMUTABLE_ROWS=true,DISABLE_WAL=true";
+
+        String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
+        String createTableStmt = "CREATE TABLE "+pTableFullName + "(k BIGINT NOT NULL PRIMARY KEY, "
+                + "v1 VARCHAR, v2 VARCHAR)"
+                + properties;
+        String viewFullName = SchemaUtil.getPTableFullNameWithQuotes(schemaName, viewName);
+
+        String createView = "CREATE VIEW "+viewFullName + "(id1 BIGINT, id2 BIGINT NOT NULL, "
                 + "id3 VARCHAR NOT NULL CONSTRAINT PKVIEW PRIMARY KEY (id2, id3 DESC)) "
                 + "AS SELECT * FROM "+pTableFullName;
 
         List<String> queries = new ArrayList<String>(){};
         queries.add(createTableStmt);
         queries.add(createView);
-        queries.add(createView1);
         String result = runSchemaExtractionTool(schemaName, viewName, null, queries);
         Assert.assertEquals(createView.toUpperCase(), result.toUpperCase());
 
@@ -153,7 +173,7 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
         String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
         String createTableStmt = "CREATE TABLE "+pTableFullName + "(k BIGINT NOT NULL PRIMARY KEY, "
                 + "v1 VARCHAR, v2 VARCHAR)";
-        String viewFullName = SchemaUtil.getQualifiedTableName(schemaName, viewName);
+        String viewFullName = SchemaUtil.getPTableFullNameWithQuotes(schemaName, viewName);
         String createViewStmt = "CREATE VIEW "+viewFullName + "(id1 BIGINT, id2 BIGINT NOT NULL, "
                 + "id3 VARCHAR NOT NULL CONSTRAINT PKVIEW PRIMARY KEY (id2, id3 DESC)) "
                 + "AS SELECT * FROM "+pTableFullName;
@@ -321,7 +341,7 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
     private String runSchemaExtractionTool(String schemaName, String tableName, String tenantId, List<String> queries) throws Exception {
         Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
         String output;
-        if (tenantId == null){
+        if (tenantId == null) {
             try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
                 executeCreateStatements(conn, queries);
                 String [] args = {"-tb", tableName, "-s", schemaName};