[
https://issues.apache.org/jira/browse/PHOENIX-2746?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15200532#comment-15200532
]
Hudson commented on PHOENIX-2746:
---------------------------------
FAILURE: Integrated in Phoenix-master #1175 (See
[https://builds.apache.org/job/Phoenix-master/1175/])
PHOENIX-2746 Delete on the table with immutable rows may fail with (rajeshbabu:
rev cd8e86ca7170876a30771fcc16c027f8dc8dd386)
* phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java
* phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java
* phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
* phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java
> Delete on the table with immutable rows may fail with
> INVALID_FILTER_ON_IMMUTABLE_ROWS error code.
> --------------------------------------------------------------------------------------------------
>
> Key: PHOENIX-2746
> URL: https://issues.apache.org/jira/browse/PHOENIX-2746
> Project: Phoenix
> Issue Type: Bug
> Affects Versions: 4.7.0
> Reporter: Rajeshbabu Chintaguntla
> Assignee: Rajeshbabu Chintaguntla
> Fix For: 4.8.0
>
> Attachments: PHOENIX-2746.patch, PHOENIX-2746_v2.patch
>
>
> Some times delete on table with immutable rows is failing with below error
> even all the indexes are having the column in where condition. If we have
> condition on primary key columns it's always failing.
> {noformat}
> 0: jdbc:phoenix:localhost> delete from t2 where a='raj1';
> Error: ERROR 1027 (42Y86): All columns referenced in a WHERE clause must be
> available in every index for a table with immutable rows. tableName=T2
> (state=42Y86,code=1027)
> java.sql.SQLException: ERROR 1027 (42Y86): All columns referenced in a WHERE
> clause must be available in every index for a table with immutable rows.
> tableName=T2
> at
> org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:386)
> at
> org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:145)
> at
> org.apache.phoenix.compile.DeleteCompiler.compile(DeleteCompiler.java:390)
> at
> org.apache.phoenix.jdbc.PhoenixStatement$ExecutableDeleteStatement.compilePlan(PhoenixStatement.java:546)
> at
> org.apache.phoenix.jdbc.PhoenixStatement$ExecutableDeleteStatement.compilePlan(PhoenixStatement.java:534)
> at
> org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:302)
> at
> org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:295)
> at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
> at
> org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:293)
> at
> org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1247)
> at sqlline.Commands.execute(Commands.java:822)
> at sqlline.Commands.sql(Commands.java:732)
> at sqlline.SqlLine.dispatch(SqlLine.java:808)
> at sqlline.SqlLine.begin(SqlLine.java:681)
> at sqlline.SqlLine.start(SqlLine.java:398)
> at sqlline.SqlLine.main(SqlLine.java:292
> {noformat}
> The reason is we are collecting nondisable indexes and adding to list.
> 1) Once after resolving the table data table.
> 2) One after running select with where condition from delete.
> So the references of index table objects will be different two times if cache
> updated again 2nd time.
> {noformat}
> immutableIndex = getNonDisabledImmutableIndexes(tableRefToBe);
> {noformat}
> So here when remove a table from immutableIndex list we should compare
> references because PTable doesn't have equal or hashCode implementations
> which will not remove any index from the list and we throw SQLException.
> {noformat}
> while (plans.hasNext()) {
> QueryPlan plan = plans.next();
> PTable table = plan.getTableRef().getTable();
> if (table.getType() == PTableType.INDEX) { // index plans
> tableRefs[i++] = plan.getTableRef();
> immutableIndex.remove(table);
> } else { // data plan
> /*
> * If we have immutable indexes that we need to maintain,
> don't execute the data plan
> * as we can save a query by piggy-backing on any of the
> other index queries, since the
> * PK columns that we need are always in each index row.
> */
> plans.remove();
> }
> {noformat}
> If the where condition is PK column then the plans returned by compiler is
> only one because we are passing USE_DATA_OVER_INDEX_TABLE hint. Then also the
> immutableIndex list is not empty. Then also we through exception.
> {noformat}
> noQueryReqd = !hasLimit;
> // Can't run on same server for transactional data, as we
> need the row keys for the data
> // that is being upserted for conflict detection purposes.
> runOnServer = isAutoCommit && noQueryReqd &&
> !table.isTransactional();
> HintNode hint = delete.getHint();
> if (runOnServer &&
> !delete.getHint().hasHint(Hint.USE_INDEX_OVER_DATA_TABLE)) {
> hint = HintNode.create(hint,
> Hint.USE_DATA_OVER_INDEX_TABLE);
> }
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)