Dávid Paksy created PHOENIX-7955:
------------------------------------

             Summary: Create table if not exists changes existing table 
properties in HBase
                 Key: PHOENIX-7955
                 URL: https://issues.apache.org/jira/browse/PHOENIX-7955
             Project: Phoenix
          Issue Type: Bug
          Components: core
            Reporter: Dávid Paksy


h2. Summary

IF NOT EXISTS clause in create table failed to guard the existing table 
properties from being changed
h2. Actual Behavior:

The table configuration is mutated. The REGION_REPLICATION property is modified 
on the existing table, bypassing the safety check of the IF NOT EXISTS clause.
h2. Expected Behavior:

If the table exists, the entire statement should be skipped safely without 
modifying any structural or operational HBase properties.
h2. Steps to Reproduce:

1. Create a standard Phoenix table with default properties.
2. Execute a CREATE TABLE IF NOT EXISTS statement on that same table, but 
append modified properties (e.g., set REGION_REPLICATION=2).
3. Check the underlying HBase table descriptor using the HBase shell (describe 
'TABLE_NAME').
h2. Steps to Reproduce (detailed):

1. Create table:
{noformat}
0: jdbc:phoenix:node-1.example.com> CREATE TABLE IF NOT EXISTS TEST_PRTY (
. . . . . . . . . . . . . . . . . . . . . . )> PRTY_ACNT_REL_KEY VARCHAR NOT 
NULL,
. . . . . . . . . . . . . . . . . . . . . . )> PRTY_IDENT_NUM VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> ACNT_ID_NUM VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> PRTY_IDENT_TYP_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> AGMT_IDENT_TYP_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> REL_TYP_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> ACNT_ID_TYP_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> DATA_SRC_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> DATA_SRC_QLFR VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> ACNT_DATA_SRC_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> PRTY_ID_QUAL VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> RECORD_DELETED_FLAG TINYINT,
. . . . . . . . . . . . . . . . . . . . . . )> START_DATE TIMESTAMP,
. . . . . . . . . . . . . . . . . . . . . . )> LAST_UPDT_DATE TIMESTAMP,
. . . . . . . . . . . . . . . . . . . . . . )> CONSTRAINT PK PRIMARY KEY 
(PRTY_ACNT_REL_KEY)
. . . . . . . . . . . . . . . . . . . . . . )> )
. . . . . . . . . . . . . . . . . . semicolon> SALT_BUCKETS=10,
. . . . . . . . . . . . . . . . . . semicolon> COMPRESSION='SNAPPY',
. . . . . . . . . . . . . . . . . . semicolon> VERSIONS=1,
. . . . . . . . . . . . . . . . . . semicolon> REGION_REPLICATION=3;
No rows affected (1.48 seconds)
{noformat}
2. Then verify the table is visible in hbase shell
{noformat}
hbase:006:0> describe "TEST_PRTY"
Table TEST_PRTY is ENABLED
TEST_PRTY, \{TABLE_ATTRIBUTES => {REGION_REPLICATION => '3', coprocessor$1 => 
'|org.apache.phoenix.coprocessor.ScanRegionObserver|805306366|', coprocessor$2 
=> 
'|org.apache.phoenix.coprocessor.UngroupedAggregateRegionObserver|805306366|', 
coprocessor$3 => 
'|org.apache.phoenix.coprocessor.GroupedAggregateRegionObserver|805306366|', 
coprocessor$4 => 
'|org.apache.phoenix.coprocessor.ServerCachingEndpointImpl|805306366|', 
coprocessor$5 => 
'|org.apache.phoenix.hbase.index.IndexRegionObserver|805306366|index.builder=org.apache.phoenix.index.PhoenixIndexBuilder,org.apache.hadoop.hbase.index.codec.class=org.apache.phoenix.index.PhoenixIndexCodec',
 METADATA => {'hbase.store.file-tracker.impl' => 'DEFAULT'}}}
COLUMN FAMILIES DESCRIPTION
{NAME => '0', INDEX_BLOCK_ENCODING => 'NONE', VERSIONS => '1', 
KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'FAST_DIFF', TTL => 
'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', 
IN_MEMORY => 'false', COMPRESSION => 'SNAPPY', BLOCKCACHE => 'true', BLOCKSIZE 
=> '65536 B (64KB)'}

1 row(s)
Quota is disabled
Took 0.0876 seconds
{noformat}
3. Now execute CREATE TABLE IF NOT EXISTS command with changed properties (ex: 
REGION_REPLICATION from 3 to 2):
{noformat}
0: jdbc:phoenix:node-1.example.com> CREATE TABLE IF NOT EXISTS TEST_PRTY (
. . . . . . . . . . . . . . . . . . . . . . )> PRTY_ACNT_REL_KEY VARCHAR NOT 
NULL,
. . . . . . . . . . . . . . . . . . . . . . )> PRTY_IDENT_NUM VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> ACNT_ID_NUM VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> PRTY_IDENT_TYP_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> AGMT_IDENT_TYP_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> REL_TYP_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> ACNT_ID_TYP_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> DATA_SRC_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> DATA_SRC_QLFR VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> ACNT_DATA_SRC_CD VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> PRTY_ID_QUAL VARCHAR,
. . . . . . . . . . . . . . . . . . . . . . )> RECORD_DELETED_FLAG TINYINT,
. . . . . . . . . . . . . . . . . . . . . . )> START_DATE TIMESTAMP,
. . . . . . . . . . . . . . . . . . . . . . )> LAST_UPDT_DATE TIMESTAMP, -- <-- 
Added missing comma here
. . . . . . . . . . . . . . . . . . . . . . )> CONSTRAINT PK PRIMARY KEY 
(PRTY_ACNT_REL_KEY)
. . . . . . . . . . . . . . . . . . . . . . )> ) -- <-- Removed premature 
semicolon here
. . . . . . . . . . . . . . . . . . semicolon> SALT_BUCKETS=10,
. . . . . . . . . . . . . . . . . . semicolon> COMPRESSION='SNAPPY',
. . . . . . . . . . . . . . . . . . semicolon> VERSIONS=1,
. . . . . . . . . . . . . . . . . . semicolon> REGION_REPLICATION=2;
{noformat}
-> Table properties changed - *NOK* (x)

4. We can see the changes in Hbase shell too
{noformat}
hbase:007:0> describe "TEST_PRTY"
Table TEST_PRTY is ENABLED
TEST_PRTY, \{TABLE_ATTRIBUTES => {REGION_REPLICATION => '2', coprocessor$1 => 
'|org.apache.phoenix.coprocessor.ScanRegionObserver|805306366|', coprocessor$2 
=> 
'|org.apache.phoenix.coprocessor.UngroupedAggregateRegionObserver|805306366|', 
coprocessor$3 => 
'|org.apache.phoenix.coprocessor.GroupedAggregateRegionObserver|805306366|', 
coprocessor$4 => 
'|org.apache.phoenix.coprocessor.ServerCachingEndpointImpl|805306366|', 
coprocessor$5 => 
'|org.apache.phoenix.hbase.index.IndexRegionObserver|805306366|index.builder=org.apache.phoenix.index.PhoenixIndexBuilder,org.apache.hadoop.hbase.index.codec.class=org.apache.phoenix.index.PhoenixIndexCodec',
 METADATA => {'hbase.store.file-tracker.impl' => 'DEFAULT'}}}
COLUMN FAMILIES DESCRIPTION
{NAME => '0', INDEX_BLOCK_ENCODING => 'NONE', VERSIONS => '1', 
KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'FAST_DIFF', TTL => 
'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', 
IN_MEMORY => 'false', COMPRESSION => 'SNAPPY', BLOCKCACHE => 'true', BLOCKSIZE 
=> '65536 B (64KB)'}

1 row(s)
Quota is disabled
{noformat}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to