Skip to content

Commit

Permalink
Merge #36001
Browse files Browse the repository at this point in the history
36001: backport-19.1: sql: Reject INTERVAL nanoseconds r=bobvawter a=bobvawter

This change is a follow-up to #32143 and #34202.  This changes the parser to
reject the "nanoseconds" token when parsing an INTERVAL value.

Fixes: #35872

Release note: None

Co-authored-by: Bob Vawter <bob@cockroachlabs.com>
  • Loading branch information
craig[bot] and bobvawter committed Mar 21, 2019
2 parents 759fc09 + 09f6e01 commit 11e004f
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 52 deletions.
2 changes: 1 addition & 1 deletion pkg/ccl/changefeedccl/bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func BenchmarkChangefeedTicks(b *testing.B) {
defer s.Stopper().Stop(ctx)
sqlDB := sqlutils.MakeSQLRunner(sqlDBRaw)
sqlDB.Exec(b, `CREATE DATABASE d`)
sqlDB.Exec(b, `SET CLUSTER SETTING changefeed.experimental_poll_interval = '0ns'`)
sqlDB.Exec(b, `SET CLUSTER SETTING changefeed.experimental_poll_interval = '0ms'`)

numRows := 1000
if testing.Short() {
Expand Down
10 changes: 5 additions & 5 deletions pkg/sql/logictest/testdata/logic_test/as_of
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ SELECT * FROM t AS OF SYSTEM TIME INTERVAL '-1us'

# Verify that we can use computed expressions.
query I
SELECT * FROM t AS OF SYSTEM TIME -( ('1000' || 'ns')::INTERVAL )
SELECT * FROM t AS OF SYSTEM TIME -( ('1000' || 'us')::INTERVAL )
----
2

Expand Down Expand Up @@ -55,17 +55,17 @@ SELECT * FROM (SELECT now()) AS OF SYSTEM TIME '2018-01-01'

# Verify that zero intervals indistinguishable from zero cause an error.

statement error pq: AS OF SYSTEM TIME: interval value '100ns' too small, must be <= -1µs
SELECT * FROM t AS OF SYSTEM TIME '100ns'
statement error pq: AS OF SYSTEM TIME: interval value '0.1us' too small, must be <= -1µs
SELECT * FROM t AS OF SYSTEM TIME '0.1us'

statement error pq: AS OF SYSTEM TIME: interval value '0,0' too small, must be <= -1µs
SELECT * FROM t AS OF SYSTEM TIME '0,0'

statement error pq: AS OF SYSTEM TIME: interval value '0.000000000,0' too small, must be <= -1µs
SELECT * FROM t AS OF SYSTEM TIME '0.000000000,0'

statement error pq: AS OF SYSTEM TIME: interval value '-100ns' too small, must be <= -1µs
SELECT * FROM t AS OF SYSTEM TIME '-100ns'
statement error pq: AS OF SYSTEM TIME: interval value '-0.1us' too small, must be <= -1µs
SELECT * FROM t AS OF SYSTEM TIME '-0.1us'

statement error pq: AS OF SYSTEM TIME: zero timestamp is invalid
SELECT * FROM t AS OF SYSTEM TIME '0'
6 changes: 6 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/datetime
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,12 @@ SELECT k, extract(element, input::timestamp) = extract_result, extract(element,
query error extract\(\): unsupported timespan: nansecond
SELECT extract(nansecond from '2001-04-10 12:04:59.34565423'::timestamp)

query error unknown unit "nanosecond"
SELECT INTERVAL '1 nanosecond';

query error unknown unit "ns"
SELECT INTERVAL '1 ns';

query IBI
SELECT k, extract(element, input::timestamptz) = extract_result, extract(element, input::timestamptz) FROM ex ORDER BY k
----
Expand Down
2 changes: 1 addition & 1 deletion pkg/sql/opt/optbuilder/testdata/select
Original file line number Diff line number Diff line change
Expand Up @@ -1125,7 +1125,7 @@ select
# This is slightly funky, because the AS OF SYSTEM TIME timestamp only gets
# interpreted by the executor, which obviously is not at play in these tests.
build
SELECT * FROM a AS OF SYSTEM TIME '-1000ns'
SELECT * FROM a AS OF SYSTEM TIME '-1000ms'
----
error (42601): AS OF SYSTEM TIME must be provided on a top-level statement

Expand Down
2 changes: 0 additions & 2 deletions pkg/sql/sem/tree/interval.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,6 @@ var unitMap = func(
}(map[string]duration.Duration{
// Use DecodeDuration here because ns is the only unit for which we do not
// want to round nanoseconds since it is only used for multiplication.
"nanosecond": duration.DecodeDuration(0, 0, time.Nanosecond.Nanoseconds()),
"microsecond": duration.MakeDuration(time.Microsecond.Nanoseconds(), 0, 0),
"millisecond": duration.MakeDuration(time.Millisecond.Nanoseconds(), 0, 0),
"second": duration.MakeDuration(time.Second.Nanoseconds(), 0, 0),
Expand All @@ -406,7 +405,6 @@ var unitMap = func(
"month": duration.MakeDuration(0, 0, 1),
"year": duration.MakeDuration(0, 0, 12),
}, map[string][]string{
"nanosecond": {"ns", "nsec", "nsecs", "nsecond", "nseconds"},
// Include PostgreSQL's unit keywords for compatibility; see
// https://github.com/postgres/postgres/blob/a01d0fa1d889cc2003e1941e8b98707c4d701ba9/src/backend/utils/adt/datetime.c#L175-L240
//
Expand Down
30 changes: 6 additions & 24 deletions pkg/sql/sem/tree/interval_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,32 +179,18 @@ func TestPGIntervalSyntax(t *testing.T) {
{`123`, ``, `interval: missing unit at position 3: "123"`},
{`123blah`, ``, `interval: unknown unit "blah" in duration "123blah"`},

{`500nanoseconds`, ``, `interval: unknown unit "nanoseconds" in duration "500nanoseconds"`},
{`500ns`, ``, `interval: unknown unit "ns" in duration "500ns"`},

// ns/us boundary
{`499ns`, `00:00:00`, ``},
{`500ns`, `00:00:00.000001`, ``},
{`.499us`, `00:00:00`, ``},
{`.5us`, `00:00:00.000001`, ``},
{`-499ns`, `00:00:00`, ``},
{`-500ns`, `-00:00:00.000001`, ``},
{`-0.499us`, `00:00:00`, ``},
{`-0.5us`, `-00:00:00.000001`, ``},
{`0.000000499s`, `00:00:00`, ``},
{`0.0000005s`, `00:00:00.000001`, ``},
{`-0.000000499s`, `00:00:00`, ``},
{`-0.0000005s`, `-00:00:00.000001`, ``},

{`1.2 nanosecond`, `00:00:00`, ``},
{`1.2 nanoseconds`, `00:00:00`, ``},
{`1.2 ns`, `00:00:00`, ``},
{` 1.2 ns `, `00:00:00`, ``},
{`-1.2ns`, `00:00:00`, ``},
{`-1.2nsec`, `00:00:00`, ``},
{`-1.2nsecs`, `00:00:00`, ``},
{`-1.2nsecond`, `00:00:00`, ``},
{`-1.2nseconds`, `00:00:00`, ``},
{`-9223372036854775808ns`, `-2562047:47:16.854775`, ``},
{`9223372036854775807ns`, `2562047:47:16.854775`, ``},

{`1.2 microsecond`, `00:00:00.000001`, ``},
{`1.2microseconds`, `00:00:00.000001`, ``},
{`1.2us`, `00:00:00.000001`, ``},
Expand All @@ -220,9 +206,6 @@ func TestPGIntervalSyntax(t *testing.T) {
{`-0.23us`, `00:00:00`, ``},
{`0.2346us`, `00:00:00`, ``},
{`-1.2us`, `-00:00:00.000001`, ``},
{`1.2us 3ns`, `00:00:00.000001`, ``},
{` 1.2us 3ns `, `00:00:00.000001`, ``},
{`3ns 1.2us`, `00:00:00.000001`, ``},

{`1.2millisecond`, `00:00:00.0012`, ``},
{`1.2milliseconds`, `00:00:00.0012`, ``},
Expand All @@ -233,7 +216,6 @@ func TestPGIntervalSyntax(t *testing.T) {
{`1.2mseconds`, `00:00:00.0012`, ``},
{`0.2304506ms`, `00:00:00.00023`, ``},
{`0.0002304506ms`, `00:00:00`, ``},
{`1 ms 1us 1ns`, `00:00:00.001001`, ``},

{`1.2second`, `00:00:01.2`, ``},
{`1.2seconds`, `00:00:01.2`, ``},
Expand All @@ -246,14 +228,14 @@ func TestPGIntervalSyntax(t *testing.T) {
{`75.5s`, `00:01:15.5`, ``},
{`3675.5s`, `01:01:15.5`, ``},
{`86475.5s`, `24:01:15.5`, ``},
{`86400s -60000ms 100us -1ns`, `23:59:00.0001`, ``},
{`86400s -60000ms 100us`, `23:59:00.0001`, ``},

{`1.2minute`, `00:01:12`, ``},
{`1.2minutes`, `00:01:12`, ``},
{`1.2m`, `00:01:12`, ``},
{`1.2min`, `00:01:12`, ``},
{`1.2mins`, `00:01:12`, ``},
{`1.2m 8s 20ns`, `00:01:20`, ``},
{`1.2m 8s`, `00:01:20`, ``},
{`0.5m`, `00:00:30`, ``},
{`120.5m`, `02:00:30`, ``},
{`0.23045067089m`, `00:00:13.82704`, ``},
Expand All @@ -264,7 +246,7 @@ func TestPGIntervalSyntax(t *testing.T) {
{`1.2h`, `01:12:00`, ``},
{`1.2hr`, `01:12:00`, ``},
{`1.2hrs`, `01:12:00`, ``},
{`1.2h 8m 20ns`, `01:20:00`, ``},
{`1.2h 8m`, `01:20:00`, ``},
{`0.5h`, `00:30:00`, ``},
{`25.5h`, `25:30:00`, ``},
{`0.23045067089h`, `00:13:49.622415`, ``},
Expand Down
28 changes: 14 additions & 14 deletions pkg/sql/sem/tree/testdata/eval/cast
Original file line number Diff line number Diff line change
Expand Up @@ -721,17 +721,17 @@ eval
9

eval
'2h3s4us5ns'::interval::int
'2h3s4us'::interval::int
----
7203

eval
'2h3s4us5ns'::interval::int::interval
'2h3s4us'::interval::int::interval
----
'02:00:03'

eval
'-2h-3s-4us-5ns'::interval::int::interval
'-2h-3s-4us'::interval::int::interval
----
'-02:00:03'

Expand Down Expand Up @@ -795,7 +795,7 @@ eval
9

eval
'2h3s4us5ns'::interval::decimal
'2h3s4us'::interval::decimal
----
7203.000004000

Expand All @@ -805,22 +805,22 @@ eval
'02:00:03.000004'

eval
'2h3s4us5ns'::interval::decimal::interval
'2h3s4us'::interval::decimal::interval
----
'02:00:03.000004'

eval
'-2h-3s-4us-5ns'::interval::decimal::interval
'-2h-3s-4us'::interval::decimal::interval
----
'-02:00:03.000004'

eval
'1mon2d3h4s5us6ns'::interval::decimal
'1mon2d3h4s5us'::interval::decimal
----
2775604.000005000

eval
'1mon2d3h4s5us6ns'::interval::decimal::interval
'1mon2d3h4s5us'::interval::decimal::interval
----
'1 mon 2 days 03:00:04.000005'

Expand All @@ -830,7 +830,7 @@ eval
'-1 mons -2 days -03:00:04.000005'

eval
'-1mon-2d-3h-4s-5us-6ns'::interval::decimal::interval
'-1mon-2d-3h-4s-5us'::interval::decimal::interval
----
'-1 mons -2 days -03:00:04.000005'

Expand All @@ -848,13 +848,13 @@ eval

# MaxInt64
eval
'296533308798y20d15h30m7s1ns'::interval::decimal::interval
'296533308798y20d15h30m7s'::interval::decimal::interval
----
'296533308798 years 20 days 15:30:07'

# MinInt64
eval
'-296533308798y-20d-15h-30m-8s-1ns'::interval::decimal::interval
'-296533308798y-20d-15h-30m-8s'::interval::decimal::interval
----
'-296533308798 years -20 days -15:30:08'

Expand All @@ -874,12 +874,12 @@ eval
9.0

eval
'2h3s4us5ns'::interval::float
'2h3s4us'::interval::float
----
7203.000004

eval
'2h3s4us5ns'::interval::float::interval
'2h3s4us'::interval::float::interval
----
'02:00:03.000004'

Expand All @@ -899,7 +899,7 @@ eval
'-1 mons -2 days -03:00:04.000005'

eval
'-1mon-2d-3h-4s-5us-6ns'::interval::float::interval
'-1mon-2d-3h-4s-5us'::interval::float::interval
----
'-1 mons -2 days -03:00:04.000005'

Expand Down
5 changes: 0 additions & 5 deletions pkg/sql/sem/tree/testdata/eval/extract
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,3 @@ eval
extract_duration(millisecond from '20s30ms40µs'::interval)
----
20030

eval
extract_duration(microsecond from '12345ns'::interval)
----
12

0 comments on commit 11e004f

Please sign in to comment.