[ 
https://issues.apache.org/jira/browse/DERBY-2605?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12496022
 ] 

A B commented on DERBY-2605:
----------------------------

> I have however found a couple of interesting things with the 
> precision/scale/maximum width check. 

Thank you for pointing these out! I forgot to mention that I didn't do any 
extensive testing of the incomplete patch that I posted.

> 1) Given table foo (x double precision), the check fails for: <snip query>

Good catch.  I think that in this case there is an implicit scale/precision 
"check" because of the multiplication operation.  For example, the following 
currently works (even though precision is > 31):

ij> values 12345678901234567890123456789012345678901234;

but if we make that part of another Derby operation--say multiplication--it 
fails:

ij> values 12345678901234567890123456789012345678901234 * 1.0;
ERROR 22003: The resulting value is outside the range for the data type 
DECIMAL/NUMERIC(31,1).

The failure occurs as part of normal Derby processing for arithmetic operation. 
 So I wonder if we only have to worry about cases where we have a standalone 
constant?  If that's true then we could add a check for ConstantNode to the 
logic in CreateTableNode.  Something like:

    DataTypeDescriptor dtd =
        (rc.getExpression() instanceof ConstantNode)
            ? rc.getExpressionType()
            : null;

    if ((dtd != null) && !dtd.isUserCreatableType())
        <error>

I haven't tested that approach, but I wonder if it might solve the 1st problem 
that you discovered.

> 2) The check fails for: create table bar as select javaclassname from 
> sys.sysaliases with no data
>    because dtd.getMaximumWidth() returns 2147483647. [...]  The data type of 
> javaclassname is
>    LONG VARCHAR.  I would expect the maximum length to be 32700.

Hmm, I would expect a max length of 32700, as well.

> I do not know if this is a bug or was intentional but the resulting maximum 
> length certainly
> exceeds the documented value for a LONG VARCHAR. 

Sounds like a bug to me, though I do not know the history of this system table. 
 There are two other system tables that have LONG VARCHAR columns: SYSTRIGGERS 
and SYSSTATEMENTS.  The latter (SYSSTATEMENTS) uses TypeId.LONGVARCHAR_MAXWIDTH 
as the max width for the column, which I think is correct (that value is 
32700).  SYSTRIGGERS uses Integer.MAX_VALUE just like SYSALIASES, but I do not 
think that's correct.

> I am doing some more investigation. I should be able to upload an updated 
> patch in a couple of days.

I appreciate your time with this.  If you'd like to post an incremental patch 
which just addresses the type problem (ex. BOOLEAN) for now, I think that would 
be fine.  You could then look into the scale/precision problem as a follow-up 
patch, if that makes things easier.  Or you can just post a single 
patch--whichever you prefer.

> You can create BOOLEAN columns in 10.3
> --------------------------------------
>
>                 Key: DERBY-2605
>                 URL: https://issues.apache.org/jira/browse/DERBY-2605
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.3.0.0
>            Reporter: Rick Hillegas
>         Assigned To: James F. Adams
>         Attachments: d2605_inc_v1.patch, d2605_v1.patch, d2605_v1.stat
>
>
> The work on DERBY-64 seems to have opened up a wormhole by which you can 
> create user tables with BOOLEAN columns. The following script shows how to do 
> this:
> drop table foo;
> create table foo
> as select systemalias from sys.sysaliases with no data;
> rename column foo.systemalias to boolcol;
> alter table foo
>   alter column boolcol null;
> select c.columndatatype
> from sys.syscolumns c, sys.systables t
> where t.tableid=c.referenceid
> and t.tablename='FOO';
> insert into foo( boolcol )
> values
> ( 0 ),
> ( 1 ),
> ( cast (null as int) )
> ;
> select * from foo;

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to