Shubham Roy created PHOENIX-7778:
------------------------------------

             Summary: ALTER TABLE SET MULTI_TENANT=true on a table with a CDC 
object causes StringIndexOutOfBoundsException when querying the CDC index — 
should be blocked at DDL time
                 Key: PHOENIX-7778
                 URL: https://issues.apache.org/jira/browse/PHOENIX-7778
             Project: Phoenix
          Issue Type: Bug
          Components: core, phoenix
    Affects Versions: 5.3.0, 5.3.1
            Reporter: Shubham Roy
            Assignee: Shubham Roy


When a Phoenix table has an associated CDC object, issuing ALTER TABLE SET 
MULTI_TENANT=true on it puts the CDC index into an irrecoverably inconsistent 
state. Any subsequent query on the CDC index that uses PARTITION_ID() or  
PHOENIX_ROW_TIMESTAMP() in the WHERE clause crashes with 
StringIndexOutOfBoundsException. The ALTER should be blocked with a clear error 
message at DDL time.

 

Steps to Reproduce:
{code:java}
-- 1. Create a regular table
CREATE TABLE PERF_TEST_SET1 (ID INTEGER NOT NULL PRIMARY KEY, V1 VARCHAR);
-- 2. Create a CDC object
CREATE CDC PERF_TEST_SET1_CDC ON PERF_TEST_SET1;
-- 3. Alter to multi-tenant (this should be blocked, but currently is not)
ALTER TABLE PERF_TEST_SET1 SET MULTI_TENANT=true;
-- 4. Query the CDC index — crashes
SELECT * FROM PHOENIX_CDC_INDEX_PERF_TEST_SET1_CDC
  WHERE " :PHOENIX_ROW_TIMESTAMP()" BETWEEN
    TO_TIMESTAMP('2026-02-28 01:00:00') AND TO_TIMESTAMP('2026-02-28 02:00:00')
  LIMIT 5; {code}
 

Observed behaviour:
{code:java}
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1967)
    at 
org.apache.phoenix.util.IndexUtil.getDataColumnFamilyName(IndexUtil.java:201)
    at 
org.apache.phoenix.schema.IndexUncoveredDataColumnRef.<init>(IndexUncoveredDataColumnRef.java:51)
    at 
org.apache.phoenix.compile.ExpressionCompiler.resolveColumn(ExpressionCompiler.java:414)
    at 
org.apache.phoenix.compile.WhereCompiler$WhereExpressionCompiler.resolveColumn(WhereCompiler.java:293)
    at 
org.apache.phoenix.compile.WhereCompiler$WhereExpressionCompiler.visit(WhereCompiler.java:275)
    at org.apache.phoenix.parse.ColumnParseNode.accept(ColumnParseNode.java:56)
    at 
org.apache.phoenix.parse.CompoundParseNode.acceptChildren(CompoundParseNode.java:58)
    at 
org.apache.phoenix.parse.ComparisonParseNode.accept(ComparisonParseNode.java:41)
    at 
org.apache.phoenix.parse.CompoundParseNode.acceptChildren(CompoundParseNode.java:58)
    at org.apache.phoenix.parse.AndParseNode.accept(AndParseNode.java:40)
    at org.apache.phoenix.compile.WhereCompiler.compile(WhereCompiler.java:202)
    at org.apache.phoenix.compile.WhereCompiler.compile(WhereCompiler.java:164)
    at 
org.apache.phoenix.compile.QueryCompiler.compileSingleFlatQuery(QueryCompiler.java:834)
    at 
org.apache.phoenix.compile.QueryCompiler.compileSingleQuery(QueryCompiler.java:721)
    at 
org.apache.phoenix.compile.QueryCompiler.compileSelect(QueryCompiler.java:319)
    at 
org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:871)
    ... {code}
Expected Behaviour:

ALTER TABLE SET MULTI_TENANT=true should fail with a clear error message if the 
table has any CDC objects, e.g.:
{code:java}
ERROR: Cannot change MULTI_TENANT property on table 'PERF_TEST_SET1' because it 
has an associated CDC object 'PERF_TEST_SET1_CDC'. {code}



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

Reply via email to