db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bryan Pendleton (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-6550) Bulk-insert causes identity columns to cycle when they shouldn't
Date Thu, 02 Jun 2016 13:46:59 GMT

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

Bryan Pendleton commented on DERBY-6550:
----------------------------------------

Possibly, but it might also mean that, in the 2 years since Rick first discovered it, the
conditions for
reproducing it have changed, and the simple reproduction script is not sufficient anymore.

Perhaps the key is in this comment in the repro script:

    inserting into an empty table from a table function uses bulk-insert

Maybe that isn't occurring when we run the reproduction; perhaps for some reason Derby is
making a different decision about whether to use bulk-insert or not.

Rick suggested that the decision is made in InsertResultSet; perhaps you could look
into that code and see if you can determine where it makes the decision about whether
to use bulk-insert or not?

> Bulk-insert causes identity columns to cycle when they shouldn't
> ----------------------------------------------------------------
>
>                 Key: DERBY-6550
>                 URL: https://issues.apache.org/jira/browse/DERBY-6550
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.11.1.1
>            Reporter: Rick Hillegas
>         Attachments: screenshot-1.png
>
>
> According to the SQL Standard, an identity column is conceptually backed by a sequence
generator. If you don't specify a cycle option (and for Derby's identity column, you can't),
then the identity column is supposed to NOT cycle. This is described by the following sections
of the 2011 edition of the SQL Standard:
> o Section 11.4 (column definition), syntax rule 16
> o Section 9.26 (Creation of a sequence generator), syntax rule 13
> If you aren't doing a bulk-insert, then Derby honors this contract. However, due to an
optimization in InsertResultSet, this contract is not honored for bigint identity columns.
Bulk-insert causes Derby to cycle past the biggest positive long value and to begin generating
negative longs.
> The following script shows this behavior:
> {noformat}
> connect 'jdbc:derby:memory:db;create=true';
> create table t
> (
>     a bigint generated always as identity ( start with 9223372036854775806 ),
>     b int
> );
> create function integerList() returns table
> (
>     a int,
>     b int,
>     c int,
>     d int
> )
> language java parameter style derby_jdbc_result_set no sql
> external name 'org.apache.derbyTesting.functionTests.tests.lang.MergeStatementTest.integerList_023';
> -- this fails because bulk-insert isn't used and we go past the end of the identity column's
range
> insert into t( b ) values ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 );
> -- inserting into an empty table from a table function uses bulk-insert
> --
> -- this should fail just like the previous statement, but it succeeds
> insert into t( b ) select b from table( integerList() ) il;
> select * from t;
> {noformat}



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

Mime
View raw message