Thanks for doing the legwork, Jinfeng. My reading of the syntax is
that since <years value> cannot be empty and must be an unsigned
integer, a minus sign directly after the quote is not valid.
INTERVAL - '1' YEAR // valid
INTERVAL '-1' YEAR // not valid
INTERVAL - '-1' YEAR // not valid
INTERVAL '0-1' YEAR TO MONTH // valid
INTERVAL - '0-1' MONTH // valid
INTERVAL '1-'
For what it's worth, here's the output from Oracle 11.
SQL*Plus: Release 11.2.0.2.0 Production on Fri Oct 23 09:54:28 2015
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL> select interval '1' year from dual;
INTERVAL'1'YEAR
---------------------------------------------------------------------------
+01-00
SQL> select interval '-1' year from dual;
INTERVAL'-1'YEAR
---------------------------------------------------------------------------
-01-00
SQL> select interval '-1-1' year from dual;
select interval '-1-1' year from dual
*
ERROR at line 1:
ORA-01867: the interval is invalid
SQL> select interval '-1-1' year to month from dual;
INTERVAL'-1-1'YEARTOMONTH
---------------------------------------------------------------------------
-01-01
SQL> select interval -'1-1' year to month from dual;
select interval -'1-1' year to month from dual
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
Per my reading of the SQL spec, Oracle gets it wrong. Oracle should
disallow query #3 and allow query #4.
Julian
On Fri, Oct 23, 2015 at 8:27 AM, Jinfeng Ni <[email protected]> wrote:
> Here is what SQL standard 2003 say about interval literal:
>
> <interval literal> ::= INTERVAL [ <sign> ] <interval string> <interval
> qualifier>
> <interval string> ::= <quote> <unquoted interval string> <quote>
>
> <unquoted interval string> ::=
> [ <sign> ] { <year-month literal> | <day-time literal> }
>
> <year-month literal> ::=
> <years value> [ <minus sign> <months value> ]
>
> | <months value>
>
> <day-time literal> ::=
> <day-time interval>
>
> | <time interval>
>
> Looks like sign could appear before the quote and inside the quote.
> The minus sign could even appear before months value.
>
>
>
>
> On Thu, Oct 22, 2015 at 10:26 PM, Julian Hyde <[email protected]> wrote:
>> First of all, look up interval laterals in the SQL standard and find out
>> whether it's even valid.
>>
>> Julian
>>
>>> On Oct 22, 2015, at 21:49, Hsuan Yi Chu <[email protected]> wrote:
>>>
>>> Hi All,
>>> I am trying to resolve CALCITE-922, (interval error, coming from attempting
>>> to get value of Interval Type).
>>>
>>> However, I found another issue regarding the "sign (i.e., + or -)" of
>>> Interval type (see CALCITE-928). To resolve it, can somebody tell me what
>>> this means:
>>>
>>> "INTERVAL -'-1' YEAR"
>>>
>>> Do the two negative signs cancel each other?