Rajeshbabu Chintaguntla created PHOENIX-7263:
------------------------------------------------
Summary: Row value constructor split keys not allowed on indexes
Key: PHOENIX-7263
URL: https://issues.apache.org/jira/browse/PHOENIX-7263
Project: Phoenix
Issue Type: Bug
Reporter: Rajeshbabu Chintaguntla
Assignee: Rajeshbabu Chintaguntla
While creating indexes if we pass row value constructor split keys getting
following errorĀ same is passing with create table because while creating the
table properly building the split keys using expression compiler which is not
the case with index creation.
{noformat}
java.lang.ClassCastException:
org.apache.phoenix.expression.RowValueConstructorExpression cannot be cast to
org.apache.phoenix.expression.LiteralExpression
at
org.apache.phoenix.compile.CreateIndexCompiler.compile(CreateIndexCompiler.java:77)
at
org.apache.phoenix.jdbc.PhoenixStatement$ExecutableCreateIndexStatement.compilePlan(PhoenixStatement.java:1205)
at
org.apache.phoenix.jdbc.PhoenixStatement$ExecutableCreateIndexStatement.compilePlan(PhoenixStatement.java:1191)
at
org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:435)
at
org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:425)
at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
at
org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:424)
at
org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:412)
at
org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:2009)
at sqlline.Commands.executeSingleQuery(Commands.java:1054)
at sqlline.Commands.execute(Commands.java:1003)
at sqlline.Commands.sql(Commands.java:967)
at sqlline.SqlLine.dispatch(SqlLine.java:734)
at sqlline.SqlLine.begin(SqlLine.java:541)
at sqlline.SqlLine.start(SqlLine.java:267)
at sqlline.SqlLine.main(SqlLine.java:206)
{noformat}
In create table:
{code:java}
final byte[][] splits = new byte[splitNodes.size()][];
ImmutableBytesWritable ptr = context.getTempPtr();
ExpressionCompiler expressionCompiler = new ExpressionCompiler(context);
for (int i = 0; i < splits.length; i++) {
ParseNode node = splitNodes.get(i);
if (node instanceof BindParseNode) {
context.getBindManager().addParamMetaData((BindParseNode) node,
VARBINARY_DATUM);
}
if (node.isStateless()) {
Expression expression = node.accept(expressionCompiler);
if (expression.evaluate(null, ptr)) {;
splits[i] = ByteUtil.copyKeyBytesIfNecessary(ptr);
continue;
}
}
throw new
SQLExceptionInfo.Builder(SQLExceptionCode.SPLIT_POINT_NOT_CONSTANT)
.setMessage("Node: " + node).build().buildException();
}
{code}
Where as in indexing expecting only literals.
{code:java}
final byte[][] splits = new byte[splitNodes.size()][];
for (int i = 0; i < splits.length; i++) {
ParseNode node = splitNodes.get(i);
if (!node.isStateless()) {
throw new
SQLExceptionInfo.Builder(SQLExceptionCode.SPLIT_POINT_NOT_CONSTANT)
.setMessage("Node: " + node).build().buildException();
}
LiteralExpression expression =
(LiteralExpression)node.accept(expressionCompiler);
splits[i] = expression.getBytes();
}
{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)