[
https://issues.apache.org/jira/browse/PHOENIX-1409?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14253075#comment-14253075
]
James Taylor commented on PHOENIX-1409:
---------------------------------------
Thanks for the revisions, [~ayingshu]. Here's some feedback:
- Rather than remove this part of the test, it should be turned into a positive
test (as it's valid now):
{code}
HTableDescriptor htableDesciptor1 =
htable1.getTableDescriptor();
HColumnDescriptor hcolumnDescriptor1 =
htableDesciptor1.getFamily(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES);
assertNotNull(hcolumnDescriptor1);
-
- try {
-
- conn.createStatement().execute("ALTER TABLE TEST_TABLE SET
IN_MEMORY=false");
- fail("Should have caught exception.");
-
- } catch (SQLException e) {
- assertTrue(e.getMessage(), e.getMessage().contains("ERROR
1025 (42Y84): Unsupported property set in ALTER TABLE command."));
- }
- }finally {
{code}
- Looks like your indenting is off here, as there should be no diff (in
AlterTableIT):
{code}
- Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
- String ddl = "CREATE TABLE T (\n"
- +"ID1 VARCHAR(15) NOT NULL,\n"
- +"ID2 VARCHAR(15) NOT NULL,\n"
- +"CREATED_DATE DATE,\n"
- +"CREATION_TIME BIGINT,\n"
- +"LAST_USED DATE,\n"
- +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) SALT_BUCKETS = 8";
- Connection conn1 = DriverManager.getConnection(getUrl(), props);
- conn1.createStatement().execute(ddl);
- ddl = "ALTER TABLE T ADD CF.STRING VARCHAR";
- conn1.createStatement().execute(ddl);
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ String ddl = "CREATE TABLE T (\n"
+ +"ID1 VARCHAR(15) NOT NULL,\n"
+ +"ID2 VARCHAR(15) NOT NULL,\n"
+ +"CREATED_DATE DATE,\n"
+ +"CREATION_TIME BIGINT,\n"
+ +"LAST_USED DATE,\n"
+ +"CONSTRAINT PK PRIMARY KEY (ID1, ID2)) SALT_BUCKETS =
8";
+ Connection conn1 = DriverManager.getConnection(getUrl(), props);
+ conn1.createStatement().execute(ddl);
+ ddl = "ALTER TABLE T ADD CF.STRING VARCHAR";
+ conn1.createStatement().execute(ddl);
{code}
- Why is this new check here? It's ok to add a new column family in an add
column call.
{code}
+ if (columnFamilyProps != null && !columnFamilyProps.isEmpty()){
+ if (!checkColumnFamilyExistence(Bytes.toBytes(tableName),
columnFamilyProps)) {
+ throw new
SQLExceptionInfo.Builder(SQLExceptionCode.COLUMN_FAMILY_NOT_FOUND).build().buildException();
+ }
+ }
{code}
- Can you add more testing in AlterTableIT to cover setting column family
properties, setting table properties, setting Phoenix table properties across
single and multiple column family scenarios?
- Here in MetaDataClient, make defaultColDescriptor a static final and just use
internally in isHTableProperty. No need to instantiate it again and again.
{code}
+ HColumnDescriptor defaultColDescriptor = new
HColumnDescriptor(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES);
+ for (String family : stmtPropsMap.keySet()) {
+ // if there is no column family specified, then use the default
column family name.
+ byte[] famBytes = Strings.isNullOrEmpty(family) ?
QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES : Bytes.toBytes(family);
+ List<Pair<String, Object>> propsList = stmtPropsMap.get(family);
+ Map<String, Object> colFamilyPropsMap = new HashMap<String,
Object>(propsList.size());
+ Map<String, Object> ttlPropsMap = new HashMap<String,
Object>(propsList.size());
+ for (Pair<String, Object> prop : propsList) {
+ String propName = prop.getFirst();
+ validateIfAllowedInAlterTable(propName);
+ if (family.isEmpty() &&
propName.equalsIgnoreCase("TTL")) {
+ settingTTL = true;
+ ttlPropsMap.put(propName, prop.getSecond());
+ } else if (isHTableProperty(propName,
defaultColDescriptor)) {
{code}
- In general, create static constants for all String property names, for
example here for "TTL" (or better yet use existing HBase constants):
{code}
+ if (family.isEmpty() &&
propName.equalsIgnoreCase("TTL")) {
{code}
- I'm confused by this code, as IS_IMMUTABLE_ROWS_PROP_NAME, MULTI_TENANT, etc
are not HTable property names, yet a check for them is in this else if
statement:
{code}
+ } else if (isHTableProperty(propName,
defaultColDescriptor)) {
+ if
(!family.equals(QueryConstants.ALL_FAMILY_PROPERTIES_KEY)) {
+ throw new
SQLExceptionInfo.Builder(SQLExceptionCode.COLUMN_FAMILY_NOT_ALLOWED_TABLE_PROPERTY)
+ .setMessage("Column Family: " + family
+ ", Property: " + propName).build()
+ .buildException();
+ }
+ if
(propName.equals(PTable.IS_IMMUTABLE_ROWS_PROP_NAME)) {
+ isImmutableRowsProp =
(Boolean)prop.getSecond();
+ } else if
(propName.equals(PhoenixDatabaseMetaData.MULTI_TENANT)) {
+ multiTenantProp =
(Boolean)prop.getSecond();
+ } else if (propName.equals(DISABLE_WAL)) {
+ disableWALProp =
(Boolean)prop.getSecond();
+ }
+ tableProps.put(propName, prop.getSecond());
+ } else {
{code}
- This seems to have diverged from Samarth's WIP patch quite a bit. Overall,
this seems to be making the code more complex, but I think we want the opposite
effect.
> Allow ALTER TABLE <table> SET command to update HTableDescriptor and
> HColumnDescriptor properties
> -------------------------------------------------------------------------------------------------
>
> Key: PHOENIX-1409
> URL: https://issues.apache.org/jira/browse/PHOENIX-1409
> Project: Phoenix
> Issue Type: Improvement
> Affects Versions: 4.2
> Reporter: James Taylor
> Assignee: Alicia Ying Shu
> Attachments: Phoenix-1409-v1.patch, Phoenix-1409.patch, WIP.patch
>
>
> Once PHOENIX-1408 is fixed, we should allow HTableDescriptor and
> HColumnDescriptor properties through the ALTER TABLE <table> SET command.
> It'd just be a matter of passing these properties through the existing
> methods, as we support this for CREATE TABLE.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)