Kevin Liew commented on PHOENIX-476:

The SQL92 spec states:
4) Let Q be the result of that <query expression>.


            a) If Q is empty, then no row is inserted and a completion con-
              dition is raised: no data.

            b) Otherwise, for each row R of Q:

              i) A candidate row of B is effectively created in which the
                 value of each column is its default value, as specified in
                 the General Rules of Subclause 11.5, "<default clause>".
                 The candidate row includes every column of B.

             ii) For every object column in the candidate row, the value of
                 the object column identified by the i-th <column name> in
                 the <insert column list> is replaced by the i-th value of

            iii) Let C be a column that is represented in the candidate row
                 and let SV be its value in the candidate row. The General
                 Rules of Subclause 9.2, "Store assignment", are applied to
                 C and SV as TARGET and VALUE, respectively.

             iv) The candidate row is inserted into B.

                 Note: The data values allowable in the candidate row may be
                 constrained by a WITH CHECK OPTION constraint. The effect
                 of a WITH CHECK OPTION constraint is defined in the General
                 Rules of Subclause 11.19, "<view definition>".

In step `b.i`, a candidate row with all default values will be constructed. 
Step `b.ii` is a bit ambiguous but I'd interpret that step such that a default 
value value could be overwritten with a null value. 

I tested with MySQL and Postgres and they both allow overwriting a default with 
a null value. Any input [~julianhyde]?

> 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
>         Attachments: PHOENIX-476.2.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

Reply via email to