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

skadam 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 7187f0a  PHOENIX-6148: [SchemaExtractionTool] DDL parsing exception in 
Phoenix in view name (#889)
7187f0a is described below

commit 7187f0a6af967cc76688a42eac426394063471fc
Author: Swaroopa Kadam <[email protected]>
AuthorDate: Wed Sep 23 11:36:00 2020 -0700

    PHOENIX-6148: [SchemaExtractionTool] DDL parsing exception in Phoenix in 
view name (#889)
    
    Co-authored-by: Swaroopa Kadam <[email protected]>
---
 .../java/org/apache/phoenix/util/SchemaUtil.java   |  8 ++++++
 .../phoenix/schema/SchemaExtractionToolIT.java     | 32 ++++++++++++++--------
 .../phoenix/schema/SchemaExtractionProcessor.java  | 18 +++++++++---
 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 732e4cf..25c409d 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
@@ -1230,4 +1230,12 @@ 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 e52903f..27fda90 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,8 +17,10 @@
  */
 package org.apache.phoenix.schema;
 
+import com.google.common.base.Strings;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
@@ -202,7 +204,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();
@@ -225,9 +227,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();
@@ -326,8 +329,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(!(StringUtils.isNumeric(value)) &&
+                        !(value.equalsIgnoreCase(Boolean.TRUE.toString()) 
||value.equalsIgnoreCase(Boolean.FALSE.toString()))) {
+                    value= "'" + value + "'";
+                }
+                optionBuilder.append(key + "=" + value);
             }
         }
         return optionBuilder.toString();

Reply via email to