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();