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