Back to home page

OSCL-LXR

 
 

    


0001 -- test for intervals
0002 
0003 -- multiply and divide an interval by a number
0004 select 3 * (timestamp'2019-10-15 10:11:12.001002' - date'2019-10-15');
0005 select interval 4 month 2 weeks 3 microseconds * 1.5;
0006 select (timestamp'2019-10-15' - timestamp'2019-10-14') / 1.5;
0007 select interval 2147483647 month * 2;
0008 select interval 2147483647 month / 0.5;
0009 select interval 2147483647 day * 2;
0010 select interval 2147483647 day / 0.5;
0011 
0012 -- interval operation with null and zero case
0013 select interval '2 seconds' / 0;
0014 select interval '2 seconds' / null;
0015 select interval '2 seconds' * null;
0016 select null * interval '2 seconds';
0017 
0018 -- interval with a positive/negative sign
0019 select -interval '-1 month 1 day -1 second';
0020 select -interval -1 month 1 day -1 second;
0021 select +interval '-1 month 1 day -1 second';
0022 select +interval -1 month 1 day -1 second;
0023 
0024 -- make intervals
0025 select make_interval(1);
0026 select make_interval(1, 2);
0027 select make_interval(1, 2, 3);
0028 select make_interval(1, 2, 3, 4);
0029 select make_interval(1, 2, 3, 4, 5);
0030 select make_interval(1, 2, 3, 4, 5, 6);
0031 select make_interval(1, 2, 3, 4, 5, 6, 7.008009);
0032 
0033 -- cast string to intervals
0034 select cast('1 second' as interval);
0035 select cast('+1 second' as interval);
0036 select cast('-1 second' as interval);
0037 select cast('+     1 second' as interval);
0038 select cast('-     1 second' as interval);
0039 select cast('- -1 second' as interval);
0040 select cast('- +1 second' as interval);
0041 
0042 -- interval literal
0043 select interval 13.123456789 seconds, interval -13.123456789 second;
0044 select interval 1 year 2 month 3 week 4 day 5 hour 6 minute 7 seconds 8 millisecond 9 microsecond;
0045 select interval '30' year '25' month '-100' day '40' hour '80' minute '299.889987299' second;
0046 select interval '0 0:0:0.1' day to second;
0047 select interval '10-9' year to month;
0048 select interval '20 15' day to hour;
0049 select interval '20 15:40' day to minute;
0050 select interval '20 15:40:32.99899999' day to second;
0051 select interval '15:40' hour to minute;
0052 select interval '15:40:32.99899999' hour to second;
0053 select interval '40:32.99899999' minute to second;
0054 select interval '40:32' minute to second;
0055 select interval 30 day day;
0056 
0057 -- invalid day-time string intervals
0058 select interval '20 15:40:32.99899999' day to hour;
0059 select interval '20 15:40:32.99899999' day to minute;
0060 select interval '15:40:32.99899999' hour to minute;
0061 select interval '15:40.99899999' hour to second;
0062 select interval '15:40' hour to second;
0063 select interval '20 40:32.99899999' minute to second;
0064 
0065 -- ns is not supported
0066 select interval 10 nanoseconds;
0067 
0068 -- map + interval test
0069 select map(1, interval 1 day, 2, interval 3 week);
0070 
0071 -- typed interval expression
0072 select interval 'interval 3 year 1 hour';
0073 select interval '3 year 1 hour';
0074 SELECT interval '1 year 3 months 2 weeks 2 days 1 hour 3 minutes 2 seconds 100 millisecond 200 microseconds';
0075 
0076 -- malformed interval literal
0077 select interval;
0078 select interval 1 fake_unit;
0079 select interval 1 year to month;
0080 select interval '1' year to second;
0081 select interval '10-9' year to month '2-1' year to month;
0082 select interval '10-9' year to month '12:11:10' hour to second;
0083 select interval '1 15:11' day to minute '12:11:10' hour to second;
0084 select interval 1 year '2-1' year to month;
0085 select interval 1 year '12:11:10' hour to second;
0086 select interval '10-9' year to month '1' year;
0087 select interval '12:11:10' hour to second '1' year;
0088 select interval (-30) day;
0089 select interval (a + 1) day;
0090 select interval 30 day day day;
0091 
0092 -- Interval year-month arithmetic
0093 
0094 create temporary view interval_arithmetic as
0095   select CAST(dateval AS date), CAST(tsval AS timestamp) from values
0096     ('2012-01-01', '2012-01-01')
0097     as interval_arithmetic(dateval, tsval);
0098 
0099 select
0100   dateval,
0101   dateval - interval '2-2' year to month,
0102   dateval - interval '-2-2' year to month,
0103   dateval + interval '2-2' year to month,
0104   dateval + interval '-2-2' year to month,
0105   - interval '2-2' year to month + dateval,
0106   interval '2-2' year to month + dateval
0107 from interval_arithmetic;
0108 
0109 select
0110   tsval,
0111   tsval - interval '2-2' year to month,
0112   tsval - interval '-2-2' year to month,
0113   tsval + interval '2-2' year to month,
0114   tsval + interval '-2-2' year to month,
0115   - interval '2-2' year to month + tsval,
0116   interval '2-2' year to month + tsval
0117 from interval_arithmetic;
0118 
0119 select
0120   interval '2-2' year to month + interval '3-3' year to month,
0121   interval '2-2' year to month - interval '3-3' year to month
0122 from interval_arithmetic;
0123 
0124 -- Interval day-time arithmetic
0125 
0126 select
0127   dateval,
0128   dateval - interval '99 11:22:33.123456789' day to second,
0129   dateval - interval '-99 11:22:33.123456789' day to second,
0130   dateval + interval '99 11:22:33.123456789' day to second,
0131   dateval + interval '-99 11:22:33.123456789' day to second,
0132   -interval '99 11:22:33.123456789' day to second + dateval,
0133   interval '99 11:22:33.123456789' day to second + dateval
0134 from interval_arithmetic;
0135 
0136 select
0137   tsval,
0138   tsval - interval '99 11:22:33.123456789' day to second,
0139   tsval - interval '-99 11:22:33.123456789' day to second,
0140   tsval + interval '99 11:22:33.123456789' day to second,
0141   tsval + interval '-99 11:22:33.123456789' day to second,
0142   -interval '99 11:22:33.123456789' day to second + tsval,
0143   interval '99 11:22:33.123456789' day to second + tsval
0144 from interval_arithmetic;
0145 
0146 select
0147   interval '99 11:22:33.123456789' day to second + interval '10 9:8:7.123456789' day to second,
0148   interval '99 11:22:33.123456789' day to second - interval '10 9:8:7.123456789' day to second
0149 from interval_arithmetic;
0150 
0151 -- control characters as white spaces
0152 select interval '\t interval 1 day';
0153 select interval 'interval \t 1\tday';
0154 select interval 'interval\t1\tday';
0155 select interval '1\t' day;
0156 select interval '1 ' day;
0157 select interval '2-2\t' year to month;
0158 select interval '-\t2-2\t' year to month;
0159 select interval '\n0 12:34:46.789\t' day to second;
0160 select interval '\n-\t10\t 12:34:46.789\t' day to second;
0161 
0162 -- interval overflow if (ansi) exception else NULL
0163 select -(a) from values (interval '-2147483648 months', interval '2147483647 months') t(a, b);
0164 select a - b from values (interval '-2147483648 months', interval '2147483647 months') t(a, b);
0165 select b + interval '1 month' from values (interval '-2147483648 months', interval '2147483647 months') t(a, b);
0166 select a * 1.1 from values (interval '-2147483648 months', interval '2147483647 months') t(a, b);
0167 select a / 0.5 from values (interval '-2147483648 months', interval '2147483647 months') t(a, b);
0168 
0169 -- interval support for csv and json functions
0170 SELECT
0171   from_csv('1, 1 day', 'a INT, b interval'),
0172   to_csv(from_csv('1, 1 day', 'a INT, b interval')),
0173   to_csv(named_struct('a', interval 32 month, 'b', interval 70 minute)),
0174   from_csv(to_csv(named_struct('a', interval 32 month, 'b', interval 70 minute)), 'a interval, b interval');
0175 SELECT
0176   from_json('{"a":"1 days"}', 'a interval'),
0177   to_json(from_json('{"a":"1 days"}', 'a interval')),
0178   to_json(map('a', interval 25 month 100 day 130 minute)),
0179   from_json(to_json(map('a', interval 25 month 100 day 130 minute)), 'a interval');