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)