Rajeshbabu Chintaguntla created PHOENIX-3568:
------------------------------------------------

             Summary: Handle row timestamp columns properly in phoenix calcite
                 Key: PHOENIX-3568
                 URL: https://issues.apache.org/jira/browse/PHOENIX-3568
             Project: Phoenix
          Issue Type: Sub-task
            Reporter: Rajeshbabu Chintaguntla
            Assignee: Rajeshbabu Chintaguntla


If we don't pass row time stamp column value phoenix pass 0 initially while 
preparing Mutations the the value will be replaced with mutation timestamp. But 
with Phoenix Calcite we are passing null so the test cases related to row 
timestamp are failing with the following errors.
{noformat}
java.sql.SQLException: java.sql.SQLException: ERROR 201 (22000): Illegal data. 
Expected length of at least 8 bytes, but had 0
        at 
org.apache.phoenix.end2end.UpsertSelectIT.testRowTimestampColWithViewsIndexesAndSaltedTables(UpsertSelectIT.java:1125)
Caused by: java.lang.RuntimeException: java.sql.SQLException: ERROR 201 
(22000): Illegal data. Expected length of at least 8 bytes, but had 0
        at 
org.apache.phoenix.end2end.UpsertSelectIT.testRowTimestampColWithViewsIndexesAndSaltedTables(UpsertSelectIT.java:1125)
Caused by: java.sql.SQLException: ERROR 201 (22000): Illegal data. Expected 
length of at least 8 bytes, but had 0
        at 
org.apache.phoenix.end2end.UpsertSelectIT.testRowTimestampColWithViewsIndexesAndSaltedTables(UpsertSelectIT.java:1125)
{noformat}

I think as a fix while preparing bind expressions if it's null we need to 
prepare proper literal expression. So that the remaining things will be taken 
care by Phoenix itself.
{noformat}
        for (int i = 0; i< projects.size() ; i++) {
            RexNode project = projects.get(i);
            if(table.getRowTimestampColPos()!= -1 && ((i + specialColumns) == 
table.getRowTimestampColPos()) && project.toString() == "null") {
                PColumn pColumn = 
table.getPKColumns().get(table.getRowTimestampColPos());
                LiteralParseNode literal = 
UpsertCompiler.getNodeForRowTimestampColumn(pColumn);
                try {
                    exprs.add(LiteralExpression.newConstant(literal.getValue(), 
pColumn.getDataType(), pColumn.getSortOrder(), Determinism.ALWAYS));
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            } else {
                exprs.add(CalciteUtils.toExpression(project, implementor));
            }
        }
        TupleProjector tupleProjector = implementor.project(exprs);
{noformat}





--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to