Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sql: Reject INTERVAL nanoseconds #35980

Merged
merged 1 commit into from
Mar 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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