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 2020/09/30 04:56:46 UTC

[phoenix] branch master updated: PHOENIX-6148: [SchemaExtractionTool] DDL parsing exception in Phoenix in view name (#900)

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

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


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

commit 7987a74e6cea1103a028e128f98e2fb3c2252b82
Author: Swaroopa Kadam <sw...@gmail.com>
AuthorDate: Tue Sep 29 21:56:35 2020 -0700

    PHOENIX-6148: [SchemaExtractionTool] DDL parsing exception in Phoenix in view name (#900)
---
 .../java/org/apache/phoenix/util/SchemaUtil.java   |  9 ++++++
 .../phoenix/schema/SchemaExtractionToolIT.java     | 32 ++++++++++++++--------
 .../phoenix/schema/SchemaExtractionProcessor.java  | 17 +++++++++---
 3 files changed, 42 insertions(+), 16 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 20c3ecd..dde9f48 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
@@ -1211,4 +1211,13 @@ public class SchemaUtil {
     public static String getNormalizedColumnName(ColumnParseNode columnParseNode) {
         return columnParseNode.getName();
     }
+
+
+    public static String getPTableFullNameWithQuotes(String pSchemaName, String pTableName) {
+        String pTableFullName = getQualifiedTableName(pSchemaName, pTableName);
+        if(!(Character.isAlphabetic(pTableName.charAt(0)))) {
+            pTableFullName = pSchemaName+".\""+pTableName+"\"";
+        }
+        return pTableFullName;
+    }
 }
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 5da6ee8..65a0e99 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
@@ -19,6 +19,8 @@ package org.apache.phoenix.schema;
 
 import org.apache.phoenix.end2end.ParallelStatsEnabledIT;
 import org.apache.phoenix.jdbc.PhoenixConnection;
+import org.apache.phoenix.parse.ParseException;
+import org.apache.phoenix.parse.SQLParser;
 import org.apache.phoenix.util.PhoenixRuntime;
 import org.apache.phoenix.util.PropertiesUtil;
 import org.apache.phoenix.util.ReadOnlyProps;
@@ -39,6 +41,7 @@ import java.util.HashSet;
 import java.util.Arrays;
 import java.util.Properties;
 
+import static junit.framework.TestCase.fail;
 import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
 
 public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
@@ -202,7 +205,7 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
                 "b_char CHAR(10) NOT NULL, " +
                 "c_var_array VARCHAR ARRAY, " +
                 "d_char_array CHAR(15) ARRAY[3] CONSTRAINT PK PRIMARY KEY (a_char, b_char)) " +
-                "TTL=2592000, IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN, REPLICATION_SCOPE=1";
+                "TTL=2592000, IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN', REPLICATION_SCOPE=1";
         List<String> queries = new ArrayList<String>(){};
         queries.add(query);
         String result = runSchemaExtractionTool(schemaName, tableName, null, queries);
@@ -213,7 +216,8 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
     public void testCreateTableWithDefaultCFProperties() throws Exception {
         String tableName = generateUniqueName();
         String schemaName = generateUniqueName();
-        String properties = "KEEP_DELETED_CELLS=TRUE, TTL=1209600, IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN, REPLICATION_SCOPE=1, DEFAULT_COLUMN_FAMILY=cv, SALT_BUCKETS=16, MULTI_TENANT=true";
+        String properties = "KEEP_DELETED_CELLS=TRUE, TTL=1209600, IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN', "
+                + "REPLICATION_SCOPE=1, DEFAULT_COLUMN_FAMILY='cv', SALT_BUCKETS=16, MULTI_TENANT=true, TIME_TEST='72HOURS'";
         String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
         String query = "create table " + pTableFullName +
                 "(a_char CHAR(15) NOT NULL, " +
@@ -233,8 +237,8 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
         String tableName = generateUniqueName();
         String schemaName = generateUniqueName();
         String properties = "\"av\".VERSIONS=2, \"bv\".VERSIONS=2, " +
-                "DATA_BLOCK_ENCODING=DIFF, " +
-                "IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN, SALT_BUCKETS=16, MULTI_TENANT=true";
+                "DATA_BLOCK_ENCODING='DIFF', " +
+                "IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN', SALT_BUCKETS=16, MULTI_TENANT=true";
         String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
         String query = "create table " + pTableFullName +
                 "(a_char CHAR(15) NOT NULL, " +
@@ -253,8 +257,8 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
         String tableName = generateUniqueName();
         String schemaName = generateUniqueName();
         String properties = "\"av\".VERSIONS=2, \"bv\".VERSIONS=3, " +
-                "\"cv\".VERSIONS=4, DATA_BLOCK_ENCODING=DIFF, " +
-                "IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN, SALT_BUCKETS=16, MULTI_TENANT=true";
+                "\"cv\".VERSIONS=4, DATA_BLOCK_ENCODING='DIFF', " +
+                "IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN', SALT_BUCKETS=16, MULTI_TENANT=true";
         String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
         final String query = "create table " + pTableFullName +
                 "(a_char CHAR(15) NOT NULL, " +
@@ -271,13 +275,12 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
 
     @Test
     public void testCreateTableWithMultipleCFProperties() throws Exception {
-        String tableName = generateUniqueName();
+        String tableName = "07"+generateUniqueName();
         String schemaName = generateUniqueName();
-        String properties = "\"av\".DATA_BLOCK_ENCODING=DIFF, \"bv\".DATA_BLOCK_ENCODING=DIFF, \"cv\".DATA_BLOCK_ENCODING=DIFF, " +
-                "IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN, SALT_BUCKETS=16, MULTI_TENANT=true";
-        String simplifiedProperties = "DATA_BLOCK_ENCODING=DIFF, IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN, SALT_BUCKETS=16, MULTI_TENANT=true";
-        String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
-        String query = "create table " + pTableFullName +
+        String properties = "\"av\".DATA_BLOCK_ENCODING='DIFF', \"bv\".DATA_BLOCK_ENCODING='DIFF', \"cv\".DATA_BLOCK_ENCODING='DIFF', " +
+                "IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN', SALT_BUCKETS=16, MULTI_TENANT=true, BLOOMFITER='ROW'";
+        String simplifiedProperties = "DATA_BLOCK_ENCODING='DIFF', IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN', SALT_BUCKETS=16, MULTI_TENANT=true, BLOOMFITER='ROW'";
+        String query = "create table " + schemaName+".\""+tableName+"\"" +
                 "(a_char CHAR(15) NOT NULL, " +
                 "b_char CHAR(10) NOT NULL, " +
                 "\"av\".\"_\" CHAR(1), " +
@@ -286,6 +289,11 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
         List<String> queries = new ArrayList<String>(){};
         queries.add(query);
         String result = runSchemaExtractionTool(schemaName, tableName, null, queries);
+        try {
+            new SQLParser(result).parseStatement();
+        } catch (ParseException pe) {
+            fail("This should not happen!");
+        }
         Assert.assertTrue(compareProperties(simplifiedProperties, getProperties(result)));
     }
 
diff --git a/phoenix-tools/src/main/java/org/apache/phoenix/schema/SchemaExtractionProcessor.java b/phoenix-tools/src/main/java/org/apache/phoenix/schema/SchemaExtractionProcessor.java
index d853123..5dd8633 100644
--- a/phoenix-tools/src/main/java/org/apache/phoenix/schema/SchemaExtractionProcessor.java
+++ b/phoenix-tools/src/main/java/org/apache/phoenix/schema/SchemaExtractionProcessor.java
@@ -17,6 +17,7 @@
  */
 package org.apache.phoenix.schema;
 
+import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
@@ -201,7 +202,7 @@ public class SchemaExtractionProcessor {
 
     private String generateCreateViewDDL(String columnInfoString, String baseTableFullName,
             String whereClause, String pSchemaName, String pTableName) {
-        String viewFullName = SchemaUtil.getQualifiedTableName(pSchemaName, pTableName);
+        String viewFullName = SchemaUtil.getPTableFullNameWithQuotes(pSchemaName, pTableName);
         StringBuilder outputBuilder = new StringBuilder(String.format(CREATE_VIEW, viewFullName,
                 columnInfoString, baseTableFullName, whereClause));
         return outputBuilder.toString();
@@ -224,9 +225,10 @@ public class SchemaExtractionProcessor {
 
         return generateTableDDLString(columnInfoString, propertiesString, pSchemaName, pTableName);
     }
+
     private String generateTableDDLString(String columnInfoString, String propertiesString,
             String pSchemaName, String pTableName) {
-        String pTableFullName = SchemaUtil.getQualifiedTableName(pSchemaName, pTableName);
+        String pTableFullName = SchemaUtil.getPTableFullNameWithQuotes(pSchemaName, pTableName);
         StringBuilder outputBuilder = new StringBuilder(String.format(CREATE_TABLE, pTableFullName));
         outputBuilder.append(columnInfoString).append(" ").append(propertiesString);
         return outputBuilder.toString();
@@ -325,8 +327,15 @@ public class SchemaExtractionProcessor {
                 if (optionBuilder.length() != 0) {
                     optionBuilder.append(", ");
                 }
-                key = columnFamilyName.equals(QueryConstants.DEFAULT_COLUMN_FAMILY)? key : String.format("\"%s\".%s", columnFamilyName, key);
-                optionBuilder.append(key+"="+value);
+                key = columnFamilyName.equals(QueryConstants.DEFAULT_COLUMN_FAMILY)?
+                        key : String.format("\"%s\".%s", columnFamilyName, key);
+                // properties value that corresponds to a number will not need single quotes around it
+                // properties value that corresponds to a boolean value will not need single quotes around it
+                if(!(NumberUtils.isNumber(value)) &&
+                        !(value.equalsIgnoreCase(Boolean.TRUE.toString()) ||value.equalsIgnoreCase(Boolean.FALSE.toString()))) {
+                    value= "'" + value + "'";
+                }
+                optionBuilder.append(key + "=" + value);
             }
         }
         return optionBuilder.toString();