From 273561c387599c5aa85c44ce73bc66fd99ae1ebd Mon Sep 17 00:00:00 2001
From: gopal tathe <44522021+techgopal@users.noreply.github.com>
Date: Sat, 14 Nov 2026 13:59:42 +0100
Subject: [PATCH 01/13] functions: reverse of an array (SQL-5) and
to_char/to_varchar of a binary (SQL-6); the reverse matrix manifest drops
Signed-off-by: gopal tathe <44522021+techgopal@users.noreply.github.com>
---
crates/krishiv-functions/src/registry/text.rs | 9 +++-
.../src/scalar/array_shape.rs | 31 +++++++++++++
crates/krishiv-functions/src/scalar/chars.rs | 7 +++
crates/krishiv-functions/src/scalar/number.rs | 33 +++++++++++++
.../src/scalar/tests/array_shape.rs | 37 +++++++++++++++
.../src/scalar/tests/number.rs | 45 ++++++++++++++++++
.../analysis/registry-matrix/reverse.json | 46 -------------------
7 files changed, 161 insertions(+), 47 deletions(-)
delete mode 100644 tests/fixtures/analysis/registry-matrix/reverse.json
diff --git a/crates/krishiv-functions/src/registry/text.rs b/crates/krishiv-functions/src/registry/text.rs
index 0dfecec11..668896986 100644
--- a/crates/krishiv-functions/src/registry/text.rs
+++ b/crates/krishiv-functions/src/registry/text.rs
@@ -226,9 +226,16 @@ pub(super) fn specs() -> Vec
')`): no difference, no raise | run | schema_of_xml | + +## Per-version differences + +- `sequence`: 4.2.0 and 4.3.0 outputs are byte identical apart from the header line. +- `schema_of_xml`: exactly one difference, in `nullValue` handling. `schema_of_xml('
', '1', '
')); +SELECT typeof(schema_of_xml('')); +SELECT schema_of_xml('') AS s; +SELECT schema_of_xml('') FROM range(3); +SELECT schema_of_xml(col) FROM VALUES ('') AS t(col); +SELECT schema_of_xml('', map(k, 'true')) FROM VALUES ('excludeAttribute') AS t(k); +SELECT schema_of_xml('', map('excludeAttribute', v)) FROM VALUES ('true') AS t(v); +-- nested, repeated, attributes only, empty, mixed text +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml('', map('excludeAttribute','true')); +SELECT schema_of_xml(''); +SELECT schema_of_xml('', map('excludeAttribute','true')); +SELECT schema_of_xml(''); +SELECT schema_of_xml('', map('excludeAttribute','true')); +SELECT schema_of_xml('text
'); +SELECT schema_of_xml('text
', map('excludeAttribute','true')); +SELECT schema_of_xml('text
', map('valueTag','val')); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml('
text
'); +SELECT schema_of_xml('1
'); +SELECT schema_of_xml('text1
'); +SELECT schema_of_xml('text1more
'); +SELECT schema_of_xml('text1more
', map('valueTag','v')); +SELECT schema_of_xml('112
'); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml('', map('ignoreSurroundingSpaces','true')); +SELECT schema_of_xml('', map('ignoreSurroundingSpaces','false')); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml('2'); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml('
<é>1é>
'); +SELECT schema_of_xml('12147483648
12147483648
12147483648
12147483648
12147483648
1'); +SELECT schema_of_xml('
'); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml('
'); +SELECT schema_of_xml('&unknown;
'); +SELECT schema_of_xml('<'); +SELECT schema_of_xml('garbage'); +SELECT schema_of_xml('', map('mode','FAILFAST')); +SELECT schema_of_xml('
', map('mode','PERMISSIVE')); +SELECT schema_of_xml('
', map('mode','DROPMALFORMED')); +SELECT schema_of_xml('
', map('excludeAttribute','true')); +SELECT schema_of_xml('
'); +SELECT schema_of_xml(' '); +-- ANSI off: same queries +SET spark.sql.ansi.enabled=false; +SELECT schema_of_xml('', map('excludeAttribute','true')); +SELECT schema_of_xml(''); +SELECT schema_of_xml(''); +SELECT schema_of_xml(NULL); +SET spark.sql.ansi.enabled=true; +-- time zone has no effect on the schema +SET spark.sql.session.timeZone=America/Los_Angeles; +SELECT schema_of_xml('
') ELSE 'ok' END; +SELECT IF(false, schema_of_xml('
'), 'ok'); +SELECT COALESCE('ok', schema_of_xml('
')); +SELECT * FROM range(2) WHERE id = 5 AND schema_of_xml('
') = 'x';
diff --git a/tests/spark-golden/functions/sequence_xml/inputs/sequence_calendar.sql b/tests/spark-golden/functions/sequence_xml/inputs/sequence_calendar.sql
new file mode 100644
index 000000000..01a80e02f
--- /dev/null
+++ b/tests/spark-golden/functions/sequence_xml/inputs/sequence_calendar.sql
@@ -0,0 +1,82 @@
+-- sequence with a CALENDAR interval step (make_interval / cast from string / legacy interval literal)
+SET spark.sql.session.timeZone=UTC;
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), make_interval(0, 1));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), make_interval(0, 0, 0, 1));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-04-05'), make_interval(0, 1, 0, 2));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), make_interval(0, 0, 0, 0, 24));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), make_interval(0, 0, 0, 0, 12));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), make_interval(0, 0, 0, 1, 12));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), make_interval(0, 0, 0, 0, 0, 0, 1));
+SELECT sequence(to_date('2018-01-31'), to_date('2018-06-30'), make_interval(0, 1));
+SELECT sequence(to_date('2018-05-31'), to_date('2018-01-01'), make_interval(0, -1));
+SELECT sequence(to_date('2018-03-01'), to_date('2018-01-01'), make_interval(0, 1));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), make_interval(0, -1));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), make_interval(0, 0));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), make_interval());
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), make_interval(0, 1, 0, -2));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), cast('1 month' as interval));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-04-05'), cast('1 month 2 days' as interval));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), cast('1 day' as interval));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), cast(NULL as interval));
+SELECT typeof(sequence(to_date('2018-01-01'), to_date('2018-03-01'), make_interval(0, 1)));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', make_interval(0, 1));
+SELECT sequence(timestamp '2018-01-31 10:00:00', timestamp '2018-06-30 10:00:00', make_interval(0, 1));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-04-05 00:00:00', make_interval(0, 1, 0, 2));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-04-05 00:00:00', make_interval(0, 1, 0, 2, 3));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', make_interval(0, 0, 0, 0, 6));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:02', make_interval(0, 0, 0, 0, 0, 0, 0.5));
+SELECT sequence(timestamp '2018-03-01 00:00:00', timestamp '2018-01-01 00:00:00', make_interval(0, -1));
+SELECT sequence(timestamp '2018-03-01 00:00:00', timestamp '2018-01-01 00:00:00', make_interval(0, 1));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', make_interval(0, -1));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', make_interval());
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-02 00:00:00', make_interval(0, 1, 0, -2));
+SELECT sequence(timestamp '2018-03-02 00:00:00', timestamp '2018-01-01 00:00:00', make_interval(0, -1, 0, 2));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-05 00:00:00', make_interval(0, 0, 0, 1));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-05 00:00:00', make_interval(0, 1, 0, 2));
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-03-01 00:00:00', make_interval(0, 1));
+SELECT sequence(timestamp_ntz '2018-01-31 10:00:00', timestamp_ntz '2018-06-30 10:00:00', make_interval(0, 1));
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-04-05 00:00:00', make_interval(0, 1, 0, 2, 3));
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-03-01 00:00:00', make_interval());
+SELECT sequence(timestamp_ntz '2018-03-01 00:00:00', timestamp_ntz '2018-01-01 00:00:00', make_interval(0, 1));
+-- DST zone
+SET spark.sql.session.timeZone=America/Los_Angeles;
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', make_interval(0, 0, 0, 1));
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', make_interval(0, 0, 0, 0, 24));
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', make_interval(0, 0, 0, 1, 1));
+SELECT sequence(timestamp '2018-03-10 12:00:00', timestamp '2018-03-12 12:00:00', make_interval(0, 0, 0, 1));
+SELECT sequence(timestamp '2018-03-10 02:30:00', timestamp '2018-03-13 02:30:00', make_interval(0, 0, 0, 1));
+SELECT sequence(timestamp '2018-02-11 02:30:00', timestamp '2018-04-11 02:30:00', make_interval(0, 1));
+SELECT sequence(timestamp '2018-11-03 00:00:00', timestamp '2018-11-06 00:00:00', make_interval(0, 0, 0, 1));
+SELECT sequence(timestamp '2018-11-03 00:00:00', timestamp '2018-11-06 00:00:00', make_interval(0, 0, 0, 0, 24));
+SELECT sequence(timestamp '2018-11-04 01:30:00', timestamp '2018-11-05 01:30:00', make_interval(0, 0, 0, 1));
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', make_interval(0, 0, 0, 1, 12));
+SELECT sequence(timestamp '2018-03-13 00:00:00', timestamp '2018-03-10 00:00:00', make_interval(0, 0, 0, -1));
+SELECT sequence(timestamp_ntz '2018-03-10 00:00:00', timestamp_ntz '2018-03-13 00:00:00', make_interval(0, 0, 0, 1));
+SELECT sequence(to_date('2018-03-10'), to_date('2018-03-13'), make_interval(0, 0, 0, 1));
+SET spark.sql.session.timeZone=UTC;
+-- ANSI off
+SET spark.sql.ansi.enabled=false;
+SELECT sequence(to_date('2018-01-01'), to_date('2018-04-05'), interval 1 month 2 days);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-04-05 00:00:00', interval 1 month 2 days);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-04-05 00:00:00', interval 1 month 2 days 3 hours);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month);
+SELECT typeof(interval 1 month 2 days);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 12 hours);
+SELECT sequence(to_date('2018-01-31'), to_date('2018-06-30'), interval 1 month);
+SELECT sequence(timestamp '2018-03-01 00:00:00', timestamp '2018-01-01 00:00:00', interval 1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 0 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-04-05'), make_interval(0, 1, 0, 2));
+SET spark.sql.ansi.enabled=true;
+-- legacy interval literals
+SET spark.sql.legacy.interval.enabled=true;
+SELECT typeof(interval 1 month 2 days);
+SELECT typeof(interval 1 month);
+SELECT typeof(interval 1 day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-04-05'), interval 1 month 2 days);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-04-05 00:00:00', interval 1 month 2 days);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval 6 hours);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 12 hours);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 0 month);
+SELECT sequence(to_date('2018-03-01'), to_date('2018-01-01'), interval 1 month);
+SET spark.sql.legacy.interval.enabled=false;
diff --git a/tests/spark-golden/functions/sequence_xml/inputs/sequence_dates.sql b/tests/spark-golden/functions/sequence_xml/inputs/sequence_dates.sql
new file mode 100644
index 000000000..d02c46098
--- /dev/null
+++ b/tests/spark-golden/functions/sequence_xml/inputs/sequence_dates.sql
@@ -0,0 +1,86 @@
+-- sequence over DATE: calendar-interval, year-month, day-time steps, default step, directions
+SET spark.sql.session.timeZone=UTC;
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '1' month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '0-1' year to month);
+SELECT sequence(to_date('2018-01-01'), to_date('2020-01-01'), interval '1' year);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval '1' day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval '1 0' day to hour);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval '2 0:0:0' day to second);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 24 hours);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-03'), interval 12 hours);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-03'), interval 1 hour);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 month 2 days);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-04-05'), interval 1 month 2 days);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'));
+SELECT sequence(to_date('2018-01-05'), to_date('2018-01-01'));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-01'));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-01'), interval 1 month);
+SELECT sequence(to_date('2018-03-01'), to_date('2018-01-01'), interval -1 month);
+SELECT sequence(to_date('2018-03-01'), to_date('2018-01-01'), interval '-1' month);
+SELECT sequence(to_date('2018-03-01'), to_date('2018-01-01'), interval '-1' day);
+SELECT sequence(to_date('2018-03-01'), to_date('2018-01-01'), interval 1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval -1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval -1 day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 0 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '0' month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '0' day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 0 day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-01'), interval 0 day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), 0);
+SELECT sequence(to_date('2018-01-31'), to_date('2018-06-30'), interval 1 month);
+SELECT sequence(to_date('2018-01-31'), to_date('2018-06-30'), interval '1' month);
+SELECT sequence(to_date('2020-01-31'), to_date('2020-05-31'), interval 1 month);
+SELECT sequence(to_date('2020-02-29'), to_date('2024-03-01'), interval '1' year);
+SELECT sequence(to_date('2018-05-31'), to_date('2018-01-01'), interval -1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), NULL);
+SELECT sequence(NULL, to_date('2018-01-05'), interval 1 day);
+SELECT sequence(to_date('2018-01-01'), NULL, interval 1 day);
+SELECT sequence(cast(NULL as date), cast(NULL as date));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), cast(NULL as interval day));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), cast(NULL as interval month));
+SELECT typeof(sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month));
+SELECT typeof(sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '1' month));
+SELECT typeof(sequence(to_date('2018-01-01'), to_date('2018-03-01')));
+SELECT sequence(to_date('0001-01-01'), to_date('0001-03-01'), interval 1 month);
+SELECT sequence(to_date('9999-11-01'), to_date('9999-12-31'), interval 1 month);
+SELECT sequence(to_date('1582-10-01'), to_date('1582-10-20'), interval 5 days);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 day 12 hours);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 microsecond);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 day 1 microsecond);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 86400000000 microseconds);
+SELECT size(sequence(to_date('2000-01-01'), to_date('2000-12-31')));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), 1);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), '1 day');
+SELECT sequence(to_date('2018-01-01'), 5, interval 1 day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 day, 1);
+SELECT sequence(to_date('2018-01-01'));
+SELECT sequence(date '2018-01-01', timestamp '2018-01-03 00:00:00', interval 1 day);
+SELECT sequence(date '2018-01-01', timestamp_ntz '2018-01-03 00:00:00', interval 1 day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval '1' year to month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval '10' day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 week);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-02-01'), interval 1 week);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month, 1);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 quarter);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-12-01'), interval 3 months);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-12-01'), interval 1 year 1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2020-12-01'), interval 1 year 1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '1 1' year to month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '1-1' year to month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-12-01'), interval 0 months 1 day);
+-- ANSI off: same queries must not change; spot check
+SET spark.sql.ansi.enabled=false;
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month);
+SELECT sequence(to_date('2018-01-31'), to_date('2018-06-30'), interval 1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '1' month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval '1' day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'));
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), 0);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 0 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval -1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), '1');
+SELECT sequence(to_date('2018-01-01'), '2018-01-05', interval 1 day);
+SET spark.sql.ansi.enabled=true;
+SELECT sequence(to_date('2018-01-01'), '2018-01-05', interval 1 day);
diff --git a/tests/spark-golden/functions/sequence_xml/inputs/sequence_errors.sql b/tests/spark-golden/functions/sequence_xml/inputs/sequence_errors.sql
new file mode 100644
index 000000000..7707ecdc9
--- /dev/null
+++ b/tests/spark-golden/functions/sequence_xml/inputs/sequence_errors.sql
@@ -0,0 +1,75 @@
+-- sequence: errors, maximum array length, conditional evaluation, columns
+SET spark.sql.session.timeZone=UTC;
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 0 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '0' month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval '0' day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval -1 month);
+SELECT sequence(to_date('2018-03-01'), to_date('2018-01-01'), interval 1 month);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval -1 day);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval -1 hour);
+SELECT sequence(timestamp '2018-01-02 00:00:00', timestamp '2018-01-01 00:00:00', interval 1 hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval 0 hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval 0 month 0 day);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval 1 month -2 days);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-02 00:00:00', interval 1 month -2 days);
+SELECT sequence(timestamp '2018-03-02 00:00:00', timestamp '2018-01-01 00:00:00', interval -1 month 2 days);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-02'), interval 1 month -2 days);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-02'), interval 1 month 0 days);
+SELECT sequence(to_date('2018-03-02'), to_date('2018-01-01'), interval -1 month -2 days);
+-- array length limit (Spark: MAX_ROUNDED_ARRAY_LENGTH = 2147483632)
+SELECT size(sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 day));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-12-31 00:00:00', interval 1 microsecond);
+SELECT size(sequence(to_date('0001-01-01'), to_date('9999-12-31'), interval 1 day));
+SELECT sequence(timestamp '0001-01-01 00:00:00', timestamp '9999-12-31 00:00:00', interval 1 microsecond);
+SELECT sequence(timestamp '0001-01-01 00:00:00', timestamp '9999-12-31 00:00:00', interval 1 millisecond);
+SELECT size(sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:05', interval 1 microsecond));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-02-01 00:00:00', interval 1 microsecond);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-12-31 00:00:00', interval 1 microsecond);
+SELECT sequence(1, 2147483647);
+SELECT sequence(1L, 2147483648L);
+SELECT sequence(1, 2147483633);
+SELECT sequence(-2147483648, 2147483647);
+SELECT sequence(-2147483648, 2147483647, 2147483647);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 106751991 days);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 9999999999 days);
+-- column inputs and conditional evaluation
+CREATE OR REPLACE TEMPORARY VIEW sq AS SELECT * FROM VALUES
+ (1, to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month),
+ (2, to_date('2018-01-01'), to_date('2018-03-01'), interval 0 month),
+ (3, to_date('2018-03-01'), to_date('2018-01-01'), interval 1 month),
+ (4, to_date('2018-01-01'), NULL, interval 1 month),
+ (5, to_date('2018-01-31'), to_date('2018-05-31'), interval 1 month) AS t(id, a, b, s);
+SELECT id, sequence(a, b, s) FROM sq WHERE id IN (1, 4, 5) ORDER BY id;
+SELECT id, sequence(a, b, s) FROM sq ORDER BY id;
+SELECT id, CASE WHEN id = 1 THEN sequence(a, b, s) ELSE array() END FROM sq ORDER BY id;
+SELECT id, IF(id = 1, sequence(a, b, s), NULL) FROM sq ORDER BY id;
+SELECT id, COALESCE(sequence(a, b, s), array(a)) FROM sq WHERE id = 1 OR id = 4 ORDER BY id;
+SELECT id, CASE WHEN s > interval 0 month THEN sequence(a, b, s) END FROM sq WHERE id <> 3 ORDER BY id;
+SELECT id, CASE WHEN a <= b THEN sequence(a, b, s) END FROM sq WHERE id <> 2 ORDER BY id;
+SELECT id FROM sq WHERE id = 1 AND size(sequence(a, b, s)) = 3;
+SELECT id FROM sq WHERE id <> 2 AND size(sequence(a, b, s)) = 3 ORDER BY id;
+SELECT id, size(sequence(a, b, s)) FROM sq WHERE id IN (1, 5) ORDER BY id;
+CREATE OR REPLACE TEMPORARY VIEW sqt AS SELECT * FROM VALUES
+ (1, timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 03:00:00', interval 1 hour),
+ (2, timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 03:00:00', interval 0 hour),
+ (3, timestamp '2018-01-01 03:00:00', timestamp '2018-01-01 00:00:00', interval 1 hour) AS t(id, a, b, s);
+SELECT id, sequence(a, b, s) FROM sqt WHERE id = 1;
+SELECT id, sequence(a, b, s) FROM sqt;
+SELECT id, CASE WHEN id = 1 THEN sequence(a, b, s) END FROM sqt ORDER BY id;
+-- ANSI off: same errors
+SET spark.sql.ansi.enabled=false;
+SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 0 month);
+SELECT sequence(to_date('2018-03-01'), to_date('2018-01-01'), interval 1 month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval 0 hour);
+SELECT sequence(timestamp '2018-01-02 00:00:00', timestamp '2018-01-01 00:00:00', interval 1 hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-12-31 00:00:00', interval 1 microsecond);
+SELECT sequence(1, 2147483647);
+SELECT id, sequence(a, b, s) FROM sq ORDER BY id;
+SET spark.sql.ansi.enabled=true;
+-- DataFrame-style type errors
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 day, interval 1 day);
+SELECT sequence(true, false);
+SELECT sequence(1.5, 3.5);
+SELECT sequence('a', 'b', interval 1 day);
+SELECT sequence(to_date('2018-01-01'), to_date('2018-01-05'), interval 1 day, 1, 2);
+SELECT sequence();
diff --git a/tests/spark-golden/functions/sequence_xml/inputs/sequence_timestamps.sql b/tests/spark-golden/functions/sequence_xml/inputs/sequence_timestamps.sql
new file mode 100644
index 000000000..f3819b18f
--- /dev/null
+++ b/tests/spark-golden/functions/sequence_xml/inputs/sequence_timestamps.sql
@@ -0,0 +1,86 @@
+-- sequence over TIMESTAMP and TIMESTAMP_NTZ
+SET spark.sql.session.timeZone=UTC;
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval 1 month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval '1' month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval '0-1' year to month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2020-01-01 00:00:00', interval '1' year);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval 6 hours);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval '6' hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 01:00:00', interval '0 0:15:0' day to second);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:02', interval 500 milliseconds);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:01', interval 250000 microseconds);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-05 00:00:00', interval 1 day);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-05 00:00:00', interval '1' day);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-05 00:00:00', interval 1 month 2 days);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-04-05 00:00:00', interval 1 month 2 days);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-04-05 00:00:00', interval 1 month 2 days 3 hours);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:03');
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:03', 1);
+SELECT sequence(timestamp '2018-01-01 00:00:03', timestamp '2018-01-01 00:00:00');
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:00');
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:00', interval 1 month);
+SELECT sequence(timestamp '2018-03-01 00:00:00', timestamp '2018-01-01 00:00:00', interval -1 month);
+SELECT sequence(timestamp '2018-03-01 00:00:00', timestamp '2018-01-01 00:00:00', interval '-1' month);
+SELECT sequence(timestamp '2018-01-02 00:00:00', timestamp '2018-01-01 00:00:00', interval -6 hours);
+SELECT sequence(timestamp '2018-01-02 00:00:00', timestamp '2018-01-01 00:00:00', interval '-6' hour);
+SELECT sequence(timestamp '2018-03-01 00:00:00', timestamp '2018-01-01 00:00:00', interval 1 month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval -1 month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval -1 hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval 0 month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval '0' month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval '0' hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:00', interval '0' hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', 0);
+SELECT sequence(timestamp '2018-01-31 10:00:00', timestamp '2018-06-30 10:00:00', interval 1 month);
+SELECT sequence(timestamp '2018-01-31 10:00:00', timestamp '2018-06-30 10:00:00', interval '1' month);
+SELECT sequence(timestamp '2020-02-29 10:00:00', timestamp '2024-03-01 10:00:00', interval '1' year);
+SELECT sequence(timestamp '2018-05-31 10:00:00', timestamp '2018-01-01 00:00:00', interval -1 month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', NULL);
+SELECT sequence(NULL, timestamp '2018-01-02 00:00:00', interval 1 hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', NULL, interval 1 hour);
+SELECT sequence(cast(NULL as timestamp), cast(NULL as timestamp));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', cast(NULL as interval day));
+SELECT typeof(sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval 1 hour));
+SELECT typeof(sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-01-02 00:00:00', interval 1 hour));
+SELECT typeof(sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval '1' hour));
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:00.000003');
+SELECT sequence(timestamp '2018-01-01 00:00:00.5', timestamp '2018-01-01 00:00:03', interval 1 second);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:03', interval 1 day);
+SELECT sequence(timestamp '2018-01-01 00:00:00', date '2018-01-03', interval 1 day);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp_ntz '2018-01-03 00:00:00', interval 1 day);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', 3600);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', 3600L);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:03', 1L);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', '1 hour');
+SELECT sequence(timestamp '2018-01-01 00:00:00', '2018-01-01 00:00:03', interval 1 second);
+SELECT sequence(timestamp '0001-01-01 00:00:00', timestamp '0001-03-01 00:00:00', interval 1 month);
+SELECT sequence(timestamp '9999-11-01 00:00:00', timestamp '9999-12-31 00:00:00', interval 1 month);
+-- TIMESTAMP_NTZ
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-03-01 00:00:00', interval 1 month);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-03-01 00:00:00', interval '1' month);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-01-02 00:00:00', interval 6 hours);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-01-02 00:00:00', interval '6' hour);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-01-05 00:00:00', interval 1 month 2 days);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-04-05 00:00:00', interval 1 month 2 days);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-01-01 00:00:03');
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:03', timestamp_ntz '2018-01-01 00:00:00');
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:03', timestamp_ntz '2018-01-01 00:00:00', interval -1 second);
+SELECT sequence(timestamp_ntz '2018-03-01 00:00:00', timestamp_ntz '2018-01-01 00:00:00', interval -1 month);
+SELECT sequence(timestamp_ntz '2018-03-01 00:00:00', timestamp_ntz '2018-01-01 00:00:00', interval 1 month);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-03-01 00:00:00', interval 0 month);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-01-02 00:00:00', interval '0' hour);
+SELECT sequence(timestamp_ntz '2018-01-31 10:00:00', timestamp_ntz '2018-06-30 10:00:00', interval 1 month);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', NULL, interval 1 hour);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-01-01 00:00:00');
+-- ANSI off
+SET spark.sql.ansi.enabled=false;
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval 1 month);
+SELECT sequence(timestamp '2018-01-31 10:00:00', timestamp '2018-06-30 10:00:00', interval 1 month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', interval '6' hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 00:00:03');
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', 0);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval 0 month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval -1 month);
+SELECT sequence(timestamp_ntz '2018-01-01 00:00:00', timestamp_ntz '2018-03-01 00:00:00', interval 1 month);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-02 00:00:00', '1');
+SET spark.sql.ansi.enabled=true;
diff --git a/tests/spark-golden/functions/sequence_xml/inputs/sequence_tz.sql b/tests/spark-golden/functions/sequence_xml/inputs/sequence_tz.sql
new file mode 100644
index 000000000..c0b119852
--- /dev/null
+++ b/tests/spark-golden/functions/sequence_xml/inputs/sequence_tz.sql
@@ -0,0 +1,67 @@
+-- sequence with a DST session time zone (America/Los_Angeles: 2018-03-11 spring forward 02:00->03:00, 2018-11-04 fall back 02:00->01:00)
+SET spark.sql.session.timeZone=America/Los_Angeles;
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval 1 day);
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval '1' day);
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval 24 hours);
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval '24' hour);
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval '1 0:0:0' day to second);
+SELECT sequence(timestamp '2018-03-10 12:00:00', timestamp '2018-03-12 12:00:00', interval 1 day);
+SELECT sequence(timestamp '2018-03-10 12:00:00', timestamp '2018-03-12 12:00:00', interval 24 hours);
+SELECT sequence(timestamp '2018-03-10 12:00:00', timestamp '2018-03-12 12:00:00', interval '1' day);
+SELECT sequence(timestamp '2018-03-10 12:00:00', timestamp '2018-03-12 12:00:00', interval '24' hour);
+SELECT sequence(timestamp '2018-03-11 00:00:00', timestamp '2018-03-11 05:00:00', interval 1 hour);
+SELECT sequence(timestamp '2018-03-11 00:00:00', timestamp '2018-03-11 05:00:00', interval '1' hour);
+SELECT sequence(timestamp '2018-03-10 02:30:00', timestamp '2018-03-13 02:30:00', interval 1 day);
+SELECT sequence(timestamp '2018-03-10 02:30:00', timestamp '2018-03-13 02:30:00', interval '1' day);
+SELECT sequence(timestamp '2018-03-10 02:30:00', timestamp '2018-03-13 02:30:00', interval 24 hours);
+SELECT sequence(timestamp '2018-03-11 02:30:00', timestamp '2018-03-12 02:30:00', interval 1 day);
+SELECT sequence(timestamp '2018-02-11 02:30:00', timestamp '2018-04-11 02:30:00', interval 1 month);
+SELECT sequence(timestamp '2018-02-11 02:30:00', timestamp '2018-04-11 02:30:00', interval '1' month);
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval 1 day 1 hour);
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval 1 month 1 day);
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00');
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', 86400);
+SELECT sequence(timestamp '2018-03-13 00:00:00', timestamp '2018-03-10 00:00:00', interval -1 day);
+SELECT sequence(timestamp '2018-03-13 00:00:00', timestamp '2018-03-10 00:00:00', interval '-1' day);
+SELECT sequence(timestamp '2018-03-13 00:00:00', timestamp '2018-03-10 00:00:00', interval -24 hours);
+SELECT sequence(timestamp '2018-03-12 02:30:00', timestamp '2018-03-10 02:30:00', interval -1 day);
+-- fall back
+SELECT sequence(timestamp '2018-11-03 00:00:00', timestamp '2018-11-06 00:00:00', interval 1 day);
+SELECT sequence(timestamp '2018-11-03 00:00:00', timestamp '2018-11-06 00:00:00', interval '1' day);
+SELECT sequence(timestamp '2018-11-03 00:00:00', timestamp '2018-11-06 00:00:00', interval 24 hours);
+SELECT sequence(timestamp '2018-11-03 00:00:00', timestamp '2018-11-06 00:00:00', interval '24' hour);
+SELECT sequence(timestamp '2018-11-03 12:00:00', timestamp '2018-11-05 12:00:00', interval 1 day);
+SELECT sequence(timestamp '2018-11-03 12:00:00', timestamp '2018-11-05 12:00:00', interval 24 hours);
+SELECT sequence(timestamp '2018-11-04 00:00:00', timestamp '2018-11-04 04:00:00', interval 1 hour);
+SELECT sequence(timestamp '2018-11-04 01:30:00', timestamp '2018-11-05 01:30:00', interval 1 day);
+SELECT sequence(timestamp '2018-10-04 01:30:00', timestamp '2018-12-04 01:30:00', interval 1 month);
+-- default step with a DST zone, timestamps from instants
+SELECT sequence(to_timestamp('2018-03-11 09:00:00Z'), to_timestamp('2018-03-11 12:00:00Z'), interval 1 hour);
+SELECT sequence(to_timestamp('2018-03-10 08:00:00Z'), to_timestamp('2018-03-12 08:00:00Z'), interval 1 day);
+-- DATE steps in DST zone
+SELECT sequence(to_date('2018-03-10'), to_date('2018-03-13'), interval 1 day);
+SELECT sequence(to_date('2018-03-10'), to_date('2018-03-13'), interval 24 hours);
+SELECT sequence(to_date('2018-03-10'), to_date('2018-03-13'));
+SELECT sequence(to_date('2018-03-10'), to_date('2018-03-13'), interval 1 month);
+-- TIMESTAMP_NTZ is zone independent
+SELECT sequence(timestamp_ntz '2018-03-10 00:00:00', timestamp_ntz '2018-03-13 00:00:00', interval 1 day);
+SELECT sequence(timestamp_ntz '2018-03-10 00:00:00', timestamp_ntz '2018-03-13 00:00:00', interval 24 hours);
+SELECT sequence(timestamp_ntz '2018-03-11 00:00:00', timestamp_ntz '2018-03-11 05:00:00', interval 1 hour);
+SELECT sequence(timestamp_ntz '2018-11-04 00:00:00', timestamp_ntz '2018-11-04 04:00:00', interval 1 hour);
+SELECT sequence(timestamp_ntz '2018-03-10 02:30:00', timestamp_ntz '2018-03-13 02:30:00', interval 1 day);
+-- another zone with a half-hour offset and Southern Hemisphere DST
+SET spark.sql.session.timeZone=Australia/Lord_Howe;
+SELECT sequence(timestamp '2018-04-01 00:00:00', timestamp '2018-04-02 00:00:00', interval 6 hours);
+SELECT sequence(timestamp '2018-10-06 00:00:00', timestamp '2018-10-09 00:00:00', interval 1 day);
+SELECT sequence(timestamp '2018-10-06 00:00:00', timestamp '2018-10-09 00:00:00', interval 24 hours);
+SET spark.sql.session.timeZone=Asia/Kolkata;
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-01-01 03:00:00', interval 1 hour);
+SELECT sequence(timestamp '2018-01-01 00:00:00', timestamp '2018-03-01 00:00:00', interval 1 month);
+-- ANSI off in a DST zone
+SET spark.sql.session.timeZone=America/Los_Angeles;
+SET spark.sql.ansi.enabled=false;
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval 1 day);
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval 24 hours);
+SELECT sequence(timestamp '2018-03-10 00:00:00', timestamp '2018-03-13 00:00:00', interval '1' day);
+SET spark.sql.ansi.enabled=true;
+SET spark.sql.session.timeZone=UTC;
diff --git a/tests/spark-golden/functions/sequence_xml/results/spark-4.2.0/schema_of_xml.sql.out b/tests/spark-golden/functions/sequence_xml/results/spark-4.2.0/schema_of_xml.sql.out
new file mode 100644
index 000000000..13af47406
--- /dev/null
+++ b/tests/spark-golden/functions/sequence_xml/results/spark-4.2.0/schema_of_xml.sql.out
@@ -0,0 +1,1738 @@
+-- Generated by run_oracle.py against Spark 4.2.0
+
+-- !query
+SET spark.sql.session.timeZone=UTC
+-- !query schema
+struct
', '1', '
')) +-- !query schema +structtext
') +-- !query schema +structtext
', map('excludeAttribute','true')) +-- !query schema +structtext
', map('valueTag','val')) +-- !query schema +struct') +-- !query schema +struct
text
') +-- !query schema +struct1
') +-- !query schema +structtext1
') +-- !query schema +structtext1more
') +-- !query schema +structtext1more
', map('valueTag','v')) +-- !query schema +struct112
') +-- !query schema +struct2') +-- !query schema +struct
2):string> +-- !query output +STRUCT
<é>1é>
') +-- !query schema +struct12147483648
12147483648
12147483648
12147483648
12147483648
1
2):string> +-- !query output +STRUCT
1):string> +-- !query output +STRUCT