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.

Reply via email to