FYI: This is marked as fixed in version 1.4.182 Beta:
http://www.h2database.com/html/changelog.html
Gili
On Tuesday, September 2, 2014 1:17:40 AM UTC-4, Gili wrote:
>
> Hi Thomas,
>
> Will this be fixed in 1.3 in the near future? I am avoiding the beta
> builds because I am under the impression they are less stable than 1.3.
>
> Thanks,
> Gili
>
> On Saturday, August 30, 2014 7:57:14 AM UTC-4, Thomas Mueller wrote:
>>
>> Hi,
>>
>> I know what the problem is. readLong will first try to convert
>> 9223372036854775808
>> to a long (that doesn't work), and then negate it (that would work, but
>> it's too late). One solution is to first negate it, and then convert to a
>> long. See below for a possible patch (not tested).
>>
>> > It seems any negative number causes the same problem. .. CREATE TABLE
>> connection (id BIGINT AUTO_INCREMENT(-1, 1) PRIMARY KEY)
>>
>> I think that's not the problem. Your statement (with -1) works for me.
>>
>> Patch (it also renames getInt to readInt):
>>
>> ### Eclipse Workspace Patch 1.0
>> #P h2
>> Index: src/main/org/h2/command/Parser.java
>> ===================================================================
>> --- src/main/org/h2/command/Parser.java (revision 5847)
>> +++ src/main/org/h2/command/Parser.java (working copy)
>> @@ -536,7 +536,7 @@
>> private Prepared parseAnalyze() {
>> Analyze command = new Analyze(session);
>> if (readIf("SAMPLE_SIZE")) {
>> - command.setTop(getPositiveInt());
>> + command.setTop(readPositiveInt());
>> }
>> return command;
>> }
>> @@ -2966,15 +2966,15 @@
>> return function;
>> }
>>
>> - private int getPositiveInt() {
>> - int v = getInt();
>> + private int readPositiveInt() {
>> + int v = readInt();
>> if (v < 0) {
>> throw DbException.getInvalidValueException("positive
>> integer", v);
>> }
>> return v;
>> }
>>
>> - private int getInt() {
>> + private int readInt() {
>> boolean minus = false;
>> if (currentTokenType == MINUS) {
>> minus = true;
>> @@ -2982,12 +2982,16 @@
>> } else if (currentTokenType == PLUS) {
>> read();
>> }
>> - if (currentTokenType != VALUE || currentValue.getType() !=
>> Value.INT) {
>> + if (currentTokenType != VALUE) {
>> throw DbException.getSyntaxError(sqlCommand, parseIndex,
>> "integer");
>> }
>> + if (minus) {
>> + // must do that now, otherwise Integer.MIN_VALUE wouldn't
>> work
>> + currentValue = currentValue.negate();
>> + }
>> int i = currentValue.getInt();
>> read();
>> - return minus ? -i : i;
>> + return i;
>> }
>>
>> private long readLong() {
>> @@ -2995,14 +2999,19 @@
>> if (currentTokenType == MINUS) {
>> minus = true;
>> read();
>> + } else if (currentTokenType == PLUS) {
>> + read();
>> }
>> - if (currentTokenType != VALUE ||
>> - (currentValue.getType() != Value.INT &&
>> currentValue.getType() != Value.LONG)) {
>> + if (currentTokenType != VALUE) {
>> throw DbException.getSyntaxError(sqlCommand, parseIndex,
>> "long");
>> }
>> + if (minus) {
>> + // must do that now, otherwise Long.MIN_VALUE wouldn't work
>> + currentValue = currentValue.negate();
>> + }
>> long i = currentValue.getLong();
>> read();
>> - return minus ? -i : i;
>> + return i;
>> }
>>
>> private boolean readBooleanSetting() {
>> @@ -3901,7 +3910,7 @@
>> column.setSequence(sequence);
>> }
>> if (readIf("SELECTIVITY")) {
>> - int value = getPositiveInt();
>> + int value = readPositiveInt();
>> column.setSelectivity(value);
>> }
>> String comment = readCommentIf();
>> @@ -4005,7 +4014,7 @@
>> readIf("CHAR");
>> if (dataType.supportsScale) {
>> if (readIf(",")) {
>> - scale = getInt();
>> + scale = readInt();
>> original += ", " + scale;
>> } else {
>> // special case: TIMESTAMP(5) actually means
>> @@ -4027,7 +4036,7 @@
>> } else if (readIf("(")) {
>> // Support for MySQL: INT(11), MEDIUMINT(8) and so on.
>> // Just ignore the precision.
>> - getPositiveInt();
>> + readPositiveInt();
>> read(")");
>> }
>> if (readIf("FOR")) {
>> @@ -4532,7 +4541,7 @@
>> command.setRowBased(false);
>> }
>> if (readIf("QUEUE")) {
>> - command.setQueueSize(getPositiveInt());
>> + command.setQueueSize(readPositiveInt());
>> }
>> command.setNoWait(readIf("NOWAIT"));
>> read("CALL");
>> @@ -4940,7 +4949,7 @@
>> } else if (readIf("NUMBERS")) {
>> command.setInt(Constants.ALLOW_LITERALS_NUMBERS);
>> } else {
>> - command.setInt(getPositiveInt());
>> + command.setInt(readPositiveInt());
>> }
>> return command;
>> } else if (readIf("DEFAULT_TABLE_TYPE")) {
>> @@ -4951,7 +4960,7 @@
>> } else if (readIf("CACHED")) {
>> command.setInt(Table.TYPE_CACHED);
>> } else {
>> - command.setInt(getPositiveInt());
>> + command.setInt(readPositiveInt());
>> }
>> return command;
>> } else if (readIf("CREATE")) {
>>
>>
>> Regards,
>> Thomas
>>
>>
>>
>>
>> On Sat, Aug 30, 2014 at 1:31 PM, Steve McLeod <[email protected]>
>> wrote:
>>
>>> It is not your use of Long.MIN_VALUE that is a problem. It seems any
>>> negative number causes the same problem. For instance, this fails with a
>>> syntax exception:
>>>
>>> CREATE TABLE connection (id BIGINT AUTO_INCREMENT(-1, 1) PRIMARY KEY);
>>>
>>>
>>> On Saturday, 30 August 2014 08:21:54 UTC+2, Gili wrote:
>>>>
>>>> Noel,
>>>>
>>>> Both the H2 documentation and java.lang.Long.MIN_VALUE indicate that
>>>> -9223372036854775808 is a legal value, yet H2 rejects it. Isn't this a bug?
>>>>
>>>> Gili
>>>>
>>>> On Saturday, August 30, 2014 1:36:15 AM UTC-4, Noel Grandin wrote:
>>>>>
>>>>> Our internal implementation of sequences uses longs for everything, so
>>>>> you will need to use values for start/stop/cycle/increment that fit
>>>>> into a long value.
>>>>>
>>>>> On Fri, Aug 29, 2014 at 11:04 PM, Gili <[email protected]>
>>>>> wrote:
>>>>> > Two clarifications:
>>>>> >
>>>>> > I am using version 1.3.176.
>>>>> > This behavior contradicts the documentation:
>>>>> > http://www.h2database.com/html/datatypes.html#bigint_type
>>>>> >
>>>>> > Please also take this opportunity to clarify the difference between
>>>>> IDENTITY
>>>>> > and BIGINT in the documentation. As far as I understand it, IDENTITY
>>>>> is
>>>>> > equivalent to "BIGINT AUTO_INCREMENT PRIMARY KEY" but it's not clear
>>>>> if
>>>>> > there are any other differences. For example, the documentation
>>>>> reads "Used
>>>>> > values are never re-used, even when the transaction is rolled back"
>>>>> for
>>>>> > IDENTITY but not for BIGINT AUTO_INCREMENT so it's not clear if
>>>>> there is
>>>>> > some magic under the hood.
>>>>> >
>>>>> > Gili
>>>>> >
>>>>> > On Friday, August 29, 2014 4:53:16 PM UTC-4, Gili wrote:
>>>>> >>
>>>>> >> Hi,
>>>>> >>
>>>>> >> If I run:
>>>>> >>
>>>>> >> CREATE TABLE connection (id BIGINT
>>>>> >> AUTO_INCREMENT(-9223372036854775808,
>>>>>
>>>>> >> 1) PRIMARY KEY);
>>>>> >>
>>>>> >> I get:
>>>>> >>
>>>>> >> Syntax error in SQL statement "CREATE TABLE CONNECTION (ID BIGINT
>>>>> >> AUTO_INCREMENT(-9223372036854775808[*], 1) PRIMARY KEY)"; expected
>>>>> "long"
>>>>> >>
>>>>> >> I've successfully initialized all other types at their minimum
>>>>> values.
>>>>> >> BIGINT seems to be the only type that has a problem with this.
>>>>> >>
>>>>> >> Gili
>>>>> >
>>>>> > --
>>>>> > You received this message because you are subscribed to the Google
>>>>> Groups
>>>>> > "H2 Database" group.
>>>>> > To unsubscribe from this group and stop receiving emails from it,
>>>>> send an
>>>>> > email to [email protected].
>>>>> > To post to this group, send email to [email protected].
>>>>> > Visit this group at http://groups.google.com/group/h2-database.
>>>>> > For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "H2 Database" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/h2-database.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
--
You received this message because you are subscribed to the Google Groups "H2
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.