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] 
> <javascript:>> 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] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> 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