[
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.