phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "James Taylor (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (PHOENIX-476) Support declaration of DEFAULT in CREATE statement
Date Sat, 22 Oct 2016 17:53:58 GMT

    [ https://issues.apache.org/jira/browse/PHOENIX-476?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15598225#comment-15598225
] 

James Taylor edited comment on PHOENIX-476 at 10/22/16 5:53 PM:
----------------------------------------------------------------

No parser changes are required:
- In CreateTableCompiler, when you compile the defaultExpression, you'll end up with a LiteralExpression
(i.e. DEFAULT -2 + 7 would be turned into a LiteralExpression of 5). Create a new CreateTableStatement
copy constructor that passes in a createTableStatement and an expressionStr. Use this to create
a new CreateTableStatement using defaultExpression.toString() to form the literal expression
string which you'll pass through to the MetaDataClient to guarantee that the default expression
is always a literal.
- By evaluating the default expression at CREATE TABLE time, and storing the evaluated expression
string value, you'll know you have literal. When reading and parsing the default value back
in PTableImpl, you can assume it's already a literal and parse it as you were doing in your
previous patch:
{code}
+                            LiteralParseNode defaultParseNode = new SQLParser(column.getExpressionStr()).parseLiteral();
+                            LiteralExpression defaultLiteral = LiteralExpression.newConstant(defaultParseNode.getValue(),
column.getDataType(), column.getMaxLength(), column.getScale(), column.getSortOrder(), Determinism.ALWAYS);
+                            ImmutableBytesWritable valuePtr = new ImmutableBytesWritable();
+                            defaultLiteral.evaluate(null, valuePtr);
+                            byteValue = ByteUtil.copyKeyBytesIfNecessary(valuePtr);
{code}


was (Author: jamestaylor):
No parser changes are required:
-In CreateTableCompiler, when you compile the defaultExpression, you'll end up with a LiteralExpression
(i.e. DEFAULT -2 + 7 would be turned into a LiteralExpression of 5). Create a new CreateTableStatement
copy constructor that passes in a createTableStatement and an expressionStr. Use this to create
a new CreateTableStatement using defaultExpression.toString() to form the literal expression
string which you'll pass through to the MetaDataClient to guarantee that the default expression
is always a literal.
- By evaluating the default expression at CREATE TABLE time, and storing the evaluated expression
string value, you'll know you have literal. When reading and parsing the default value back
in PTableImpl, you can assume it's already a literal and parse it as you were doing in your
previous patch:
{code}
+                            LiteralParseNode defaultParseNode = new SQLParser(column.getExpressionStr()).parseLiteral();
+                            LiteralExpression defaultLiteral = LiteralExpression.newConstant(defaultParseNode.getValue(),
column.getDataType(), column.getMaxLength(), column.getScale(), column.getSortOrder(), Determinism.ALWAYS);
+                            ImmutableBytesWritable valuePtr = new ImmutableBytesWritable();
+                            defaultLiteral.evaluate(null, valuePtr);
+                            byteValue = ByteUtil.copyKeyBytesIfNecessary(valuePtr);
{code}

> Support declaration of DEFAULT in CREATE statement
> --------------------------------------------------
>
>                 Key: PHOENIX-476
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-476
>             Project: Phoenix
>          Issue Type: Task
>    Affects Versions: 3.0-Release
>            Reporter: James Taylor
>            Assignee: Kevin Liew
>              Labels: enhancement
>             Fix For: 4.9.0
>
>         Attachments: PHOENIX-476.2.patch, PHOENIX-476.3.patch, PHOENIX-476.4.patch, PHOENIX-476.5.patch,
PHOENIX-476.6.patch, PHOENIX-476.7.patch, PHOENIX-476.patch
>
>
> Support the declaration of a default value in the CREATE TABLE/VIEW statement like this:
>     CREATE TABLE Persons (
>         Pid int NOT NULL PRIMARY KEY,
>         LastName varchar(255) NOT NULL,
>         FirstName varchar(255),
>         Address varchar(255),
>         City varchar(255) DEFAULT 'Sandnes'
>     )
> To implement this, we'd need to:
> 1. add a new DEFAULT_VALUE key value column in SYSTEM.TABLE and pass through the value
when the table is created (in MetaDataClient).
> 2. always set NULLABLE to ResultSetMetaData.columnNoNulls if a default value is present,
since the column will never be null.
> 3. add a getDefaultValue() accessor in PColumn
> 4.  for a row key column, during UPSERT use the default value if no value was specified
for that column. This could be done in the PTableImpl.newKey method.
> 5.  for a key value column with a default value, we can get away without incurring any
storage cost. Although a little bit of extra effort than if we persisted the default value
on an UPSERT for key value columns, this approach has the benefit of not incurring any storage
cost for a default value.
>     * serialize any default value into KeyValueColumnExpression
>     * in the evaluate method of KeyValueColumnExpression, conditionally use the default
value if the column value is not present. If doing partial evaluation, you should not yet
return the default value, as we may not have encountered the the KeyValue for the column yet
(since a filter evaluates each time it sees each KeyValue, and there may be more than one
KeyValue referenced in the expression). Partial evaluation is determined by calling Tuple.isImmutable(),
where false means it is NOT doing partial evaluation, while true means it is.
>     * modify EvaluateOnCompletionVisitor by adding a visitor method for RowKeyColumnExpression
and KeyValueColumnExpression to set evaluateOnCompletion to true if they have a default value
specified. This will cause filter evaluation to execute one final time after all KeyValues
for a row have been seen, since it's at this time we know we should use the default value.



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

Mime
View raw message