%html($config)
@@ -500,12 +607,11 @@
}
}
if {[wapp-param-exists control_run]} {
# This is a "run test" command.
- set_test_array
- set ::G(state) "running"
+ wapptest_run
}
if {[wapp-param-exists control_stop]} {
# A "STOP tests" command.
set G(state) "stopped"
@@ -516,10 +622,11 @@
close $G(test.$name.channel)
unset G(test.$name.channel)
slave_test_done $name 1
}
}
+ wapptest_closelog
}
if {[wapp-param-exists control_reset]} {
# A "reset app" command.
set G(state) "config"
@@ -666,9 +773,125 @@
%html($data)
}
}
+
+# Print out a usage message. Then do [exit 1].
+#
+proc wapptest_usage {} {
+ puts stderr {
+This Tcl script is used to test various configurations of SQLite. By
+default it uses "wapp" to provide an interactive interface. Supported
+command line options (all optional) are:
+
+ --platform PLATFORM (which tests to run)
+ --smoketest (run "make smoketest" only)
+ --veryquick (run veryquick.test only)
+ --buildonly (build executables, do not run tests)
+ --jobs N (number of concurrent jobs)
+ --tcl DIR (where to find tclConfig.sh)
+ --deletefiles (delete extra files after each test)
+ --msvc (Use MS Visual C)
+ --debug (Also run [n]debugging versions of tests)
+ --noui (do not use wapp)
+ }
+ exit 1
+}
+
+# Sort command line arguments into two groups: those that belong to wapp,
+# and those that belong to the application.
+set WAPPARG(-server) 1
+set WAPPARG(-local) 1
+set WAPPARG(-scgi) 1
+set WAPPARG(-remote-scgi) 1
+set WAPPARG(-fromip) 1
+set WAPPARG(-nowait) 0
+set WAPPARG(-cgi) 0
+set lWappArg [list]
+set lTestArg [list]
+for {set i 0} {$i < [llength $argv]} {incr i} {
+ set arg [lindex $argv $i]
+ if {[string range $arg 0 1]=="--"} {
+ set arg [string range $arg 1 end]
+ }
+ if {[info exists WAPPARG($arg)]} {
+ lappend lWappArg $arg
+ if {$WAPPARG($arg)} {
+ incr i
+ lappend lWappArg [lindex $argv $i]
+ }
+ } else {
+ lappend lTestArg $arg
+ }
+}
wapptest_init
-wapp-start $argv
+for {set i 0} {$i < [llength $lTestArg]} {incr i} {
+ set opt [lindex $lTestArg $i]
+ if {[string range $opt 0 1]=="--"} {
+ set opt [string range $opt 1 end]
+ }
+ switch -- $opt {
+ -platform {
+ if {$i==[llength $lTestArg]-1} { wapptest_usage }
+ incr i
+ set arg [lindex $lTestArg $i]
+ set lPlatform [releasetest_data platforms]
+ if {[lsearch $lPlatform $arg]<0} {
+ puts stderr "No such platform: $arg. Platforms are: $lPlatform"
+ exit -1
+ }
+ set G(platform) $arg
+ }
+
+ -smoketest { set G(test) Smoketest }
+ -veryquick { set G(test) Veryquick }
+ -buildonly { set G(test) Build-Only }
+ -jobs {
+ if {$i==[llength $lTestArg]-1} { wapptest_usage }
+ incr i
+ set G(jobs) [lindex $lTestArg $i]
+ }
+
+ -tcl {
+ if {$i==[llength $lTestArg]-1} { wapptest_usage }
+ incr i
+ set G(tcl) [lindex $lTestArg $i]
+ }
+
+ -deletefiles {
+ set G(keep) 0
+ }
+
+ -msvc {
+ set G(msvc) 1
+ }
+
+ -debug {
+ set G(debug) 1
+ }
+
+ -noui {
+ set G(noui) 1
+ set G(stdout) 1
+ }
+
+ -stdout {
+ set G(stdout) 1
+ }
+
+ default {
+ puts stderr "Unrecognized option: [lindex $lTestArg $i]"
+ wapptest_usage
+ }
+ }
+}
+
+if {$G(noui)==0} {
+ wapp-start $lWappArg
+} else {
+ wapptest_run
+ do_some_stuff
+ vwait forever
+}
Index: test/where.test
==================================================================
--- test/where.test
+++ test/where.test
@@ -488,16 +488,16 @@
} {2 1 9 3 1 16 6}
do_test where-5.14 {
count {
SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1;
}
- } {2 1 9 5}
+ } {2 1 9 4}
do_test where-5.15 {
count {
SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,16) ORDER BY 1;
}
- } {2 1 9 3 1 16 9}
+ } {2 1 9 3 1 16 8}
do_test where-5.100 {
db eval {
SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)
ORDER BY x, y
}
@@ -1536,7 +1536,39 @@
do_catchsql_test where-25.5 {
INSERT INTO t1 VALUES(4, 'four', 'iii')
ON CONFLICT(c) DO UPDATE SET b=NULL
} {1 {corrupt database}}
-finish_test
+# 2019-08-21 Ticket https://www.sqlite.org/src/info/d9f584e936c7a8d0
+#
+db close
+sqlite3 db :memory:
+do_execsql_test where-26.1 {
+ CREATE TABLE t0(c0 INTEGER PRIMARY KEY, c1 TEXT);
+ INSERT INTO t0(c0, c1) VALUES (1, 'a');
+ CREATE TABLE t1(c0 INT PRIMARY KEY, c1 TEXT);
+ INSERT INTO t1(c0, c1) VALUES (1, 'a');
+ SELECT * FROM t0 WHERE '-1' BETWEEN 0 AND t0.c0;
+} {1 a}
+do_execsql_test where-26.2 {
+ SELECT * FROM t1 WHERE '-1' BETWEEN 0 AND t1.c0;
+} {1 a}
+do_execsql_test where-26.3 {
+ SELECT * FROM t0 WHERE '-1'>=0 AND '-1'<=t0.c0;
+} {1 a}
+do_execsql_test where-26.4 {
+ SELECT * FROM t1 WHERE '-1'>=0 AND '-1'<=t1.c0;
+} {1 a}
+do_execsql_test where-26.5 {
+ SELECT '-1' BETWEEN 0 AND t0.c0 FROM t0;
+} {1}
+do_execsql_test where-26.6 {
+ SELECT '-1' BETWEEN 0 AND t1.c0 FROM t1;
+} {1}
+do_execsql_test where-26.7 {
+ SELECT '-1'>=0 AND '-1'<=t0.c0 FROM t0;
+} {1}
+do_execsql_test where-26.8 {
+ SELECT '-1'>=0 AND '-1'<=t1.c0 FROM t1;
+} {1}
+finish_test
Index: test/where9.test
==================================================================
--- test/where9.test
+++ test/where9.test
@@ -785,11 +785,11 @@
OR (b NOT NULL AND c NOT NULL AND d IS NULL)
}
} {1 {no query solution}}
set solution_possible 0
-ifcapable stat4||stat3 {
+ifcapable stat4 {
if {[permutation] != "no_optimization"} { set solution_possible 1 }
}
if $solution_possible {
# When STAT3 is enabled, the "b NOT NULL" terms get translated
# into b>NULL, which can be satified by the index t1b. It is a very
@@ -858,15 +858,10 @@
CREATE INDEX t5yg ON t5(y, g);
CREATE TABLE t6(a, b, c, e, d, f, g, x, y);
INSERT INTO t6 SELECT * FROM t5;
ANALYZE t5;
}
- ifcapable stat3 {
- sqlite3 db2 test.db
- db2 eval { DROP TABLE IF EXISTS sqlite_stat3 }
- db2 close
- }
} {}
do_test where9-7.1.1 {
count_steps {
SELECT a FROM t5 WHERE x='y' AND (b=913 OR c=27027) ORDER BY a;
}
Index: test/whereA.test
==================================================================
--- test/whereA.test
+++ test/whereA.test
@@ -168,22 +168,7 @@
INSERT INTO t1 VALUES(1,2);
CREATE INDEX t1b ON t1(b);
SELECT a FROM t1 WHERE b=-99 OR b>1;
} {1}
-# 2020-10-02 OSSFuzz find for an issue introduced by a check-in
-# on the previous day.
-#
-reset_db
-do_execsql_test whereA-6.1 {
- CREATE TABLE t1(a, b);
- CREATE INDEX t1aa ON t1(a,a);
- INSERT INTO t1 VALUES(1,2);
- ANALYZE;
- UPDATE sqlite_stat1 SET stat='27 3 3' WHERE idx='t1aa';
- ANALYZE sqlite_master;
- PRAGMA reverse_unordered_selects (1) ;
- SELECT a FROM t1 WHERE a=1 OR a=2;
-} {1}
-
finish_test
Index: test/whereG.test
==================================================================
--- test/whereG.test
+++ test/whereG.test
@@ -218,19 +218,13 @@
} {SCAN TABLE t1}
do_eqp_test 5.2.4 {
SELECT * FROM t1 WHERE likely(b>?)
} {SCAN TABLE t1}
-ifcapable stat4 {
- do_eqp_test 5.3.1.stat4 {
- SELECT * FROM t1 WHERE a=?
- } {SCAN TABLE t1}
-} else {
- do_eqp_test 5.3.1 {
- SELECT * FROM t1 WHERE a=?
- } {SEARCH TABLE t1 USING INDEX i1}
-}
+do_eqp_test 5.3.1 {
+ SELECT * FROM t1 WHERE a=?
+} {SEARCH TABLE t1 USING INDEX i1 (a=?)}
do_eqp_test 5.3.2 {
SELECT * FROM t1 WHERE likelihood(a=?, 0.9)
} {SCAN TABLE t1}
do_eqp_test 5.3.3 {
SELECT * FROM t1 WHERE likely(a=?)
@@ -269,8 +263,50 @@
SELECT likelihood(a,0.5), x FROM t1, t2 ORDER BY 1, 2;
} {1 3 1 4 9 3 9 4}
do_execsql_test 7.3 {
SELECT coalesce(a,a), x FROM t1, t2 ORDER BY 1, 2;
} {1 3 1 4 9 3 9 4}
+
+# 2019-08-22
+# Ticket https://www.sqlite.org/src/info/7e07a3dbf5a8cd26
+#
+do_execsql_test 8.1 {
+ DROP TABLE IF EXISTS t0;
+ CREATE TABLE t0 (c0);
+ INSERT INTO t0(c0) VALUES ('a');
+ SELECT LIKELY(t0.rowid) <= '0' FROM t0;
+} {1}
+do_execsql_test 8.2 {
+ SELECT * FROM t0 WHERE LIKELY(t0.rowid) <= '0';
+} {a}
+do_execsql_test 8.3 {
+ SELECT (t0.rowid) <= '0' FROM t0;
+} {0}
+do_execsql_test 8.4 {
+ SELECT * FROM t0 WHERE (t0.rowid) <= '0';
+} {}
+do_execsql_test 8.5 {
+ SELECT unlikely(t0.rowid) <= '0', likelihood(t0.rowid,0.5) <= '0' FROM t0;
+} {1 1}
+do_execsql_test 8.6 {
+ SELECT * FROM t0 WHERE unlikely(t0.rowid) <= '0';
+} {a}
+do_execsql_test 8.7 {
+ SELECT * FROM t0 WHERE likelihood(t0.rowid, 0.5) <= '0';
+} {a}
+do_execsql_test 8.8 {
+ SELECT unlikely(t0.rowid <= '0'),
+ likely(t0.rowid <= '0'),
+ likelihood(t0.rowid <= '0',0.5)
+ FROM t0;
+} {0 0 0}
+do_execsql_test 8.9 {
+ SELECT * FROM t0 WHERE unlikely(t0.rowid <= '0');
+} {}
+do_execsql_test 8.10 {
+ SELECT * FROM t0 WHERE likelihood(t0.rowid <= '0', 0.5);
+} {}
+
+
finish_test
DELETED test/wild001.test
Index: test/wild001.test
==================================================================
--- test/wild001.test
+++ /dev/null
@@ -1,311 +0,0 @@
-# 2013-07-01
-#
-# The author disclaims copyright to this source code. In place of
-# a legal notice, here is a blessing:
-#
-# May you do good and not evil.
-# May you find forgiveness for yourself and forgive others.
-# May you share freely, never taking more than you give.
-#
-#***********************************************************************
-#
-# This is a test case from content taken "from the wild". In this
-# particular instance, the query was provided with permission by
-# Elan Feingold on 2013-06-27. His message on the SQLite mailing list
-# on that date reads:
-#
-#------------------------------------------------------------------------------
-# > Can you send (1) the schema (2) the query that is giving problems, and (3)
-# > the content of the sqlite_stat1 table after you have run ANALYZE? If you
-# > can combine all of the above into a script, that would be great!
-# >
-# > If you send (1..3) above and you give us written permission to include the
-# > query in our test suite, that would be off-the-chain terrific.
-#
-# Please find items 1..3 in this file: http://www.plexapp.com/elan/sqlite_bug.txt
-#
-# You have our permission to include the query in your test suite.
-#
-# Thanks for an amazing product.
-#-----------------------------------------------------------------------------
-#
-# This test case merely creates the schema and populates SQLITE_STAT1 and
-# SQLITE_STAT3 then runs an EXPLAIN QUERY PLAN to ensure that the right plan
-# is discovered. This test case may need to be adjusted for future revisions
-# of the query planner manage to select a better query plan. The query plan
-# shown here is known to be very fast with the original data.
-#
-# This test should work the same with and without SQLITE_ENABLE_STAT3
-#
-###############################################################################
-
-set testdir [file dirname $argv0]
-source $testdir/tester.tcl
-
-ifcapable !stat3 {
- finish_test
- return
-}
-
-do_execsql_test wild001.01 {
- CREATE TABLE "items" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "secid" integer, "parent_id" integer, "metadata_type" integer, "guid" varchar(255), "media_item_count" integer, "title" varchar(255), "title_sort" varchar(255) COLLATE NOCASE, "original_title" varchar(255), "studio" varchar(255), "rating" float, "rating_count" integer, "tagline" varchar(255), "summary" text, "trivia" text, "quotes" text, "content_rating" varchar(255), "content_rating_age" integer, "index" integer, "absolute_index" integer, "duration" integer, "user_thumb_url" varchar(255), "user_art_url" varchar(255), "user_banner_url" varchar(255), "user_music_url" varchar(255), "user_fields" varchar(255), "tags_genre" varchar(255), "tags_collection" varchar(255), "tags_director" varchar(255), "tags_writer" varchar(255), "tags_star" varchar(255), "originally_available_at" datetime, "available_at" datetime, "expires_at" datetime, "refreshed_at" datetime, "year" integer, "added_at" datetime, "created_at" datetime, "updated_at" datetime, "deleted_at" datetime, "tags_country" varchar(255), "extra_data" varchar(255), "hash" varchar(255));
- CREATE INDEX "i_secid" ON "items" ("secid" );
- CREATE INDEX "i_parent_id" ON "items" ("parent_id" );
- CREATE INDEX "i_created_at" ON "items" ("created_at" );
- CREATE INDEX "i_index" ON "items" ("index" );
- CREATE INDEX "i_title" ON "items" ("title" );
- CREATE INDEX "i_title_sort" ON "items" ("title_sort" );
- CREATE INDEX "i_guid" ON "items" ("guid" );
- CREATE INDEX "i_metadata_type" ON "items" ("metadata_type" );
- CREATE INDEX "i_deleted_at" ON "items" ("deleted_at" );
- CREATE INDEX "i_secid_ex1" ON "items" ("secid", "metadata_type", "added_at" );
- CREATE INDEX "i_hash" ON "items" ("hash" );
- CREATE TABLE "settings" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "account_id" integer, "guid" varchar(255), "rating" float, "view_offset" integer, "view_count" integer, "last_viewed_at" datetime, "created_at" datetime, "updated_at" datetime);
- CREATE INDEX "s_account_id" ON "settings" ("account_id" );
- CREATE INDEX "s_guid" ON "settings" ("guid" );
- ANALYZE;
- INSERT INTO sqlite_stat1 VALUES('settings','s_guid','4740 1');
- INSERT INTO sqlite_stat1 VALUES('settings','s_account_id','4740 4740');
- INSERT INTO sqlite_stat1 VALUES('items','i_hash','27316 2');
- INSERT INTO sqlite_stat1 VALUES('items','i_secid_ex1','27316 6829 4553 3');
- INSERT INTO sqlite_stat1 VALUES('items','i_deleted_at','27316 27316');
- INSERT INTO sqlite_stat1 VALUES('items','i_metadata_type','27316 6829');
- INSERT INTO sqlite_stat1 VALUES('items','i_guid','27316 2');
- INSERT INTO sqlite_stat1 VALUES('items','i_title_sort','27316 2');
- INSERT INTO sqlite_stat1 VALUES('items','i_title','27316 2');
- INSERT INTO sqlite_stat1 VALUES('items','i_index','27316 144');
- INSERT INTO sqlite_stat1 VALUES('items','i_created_at','27316 2');
- INSERT INTO sqlite_stat1 VALUES('items','i_parent_id','27316 15');
- INSERT INTO sqlite_stat1 VALUES('items','i_secid','27316 6829');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,150,150,'com.plexapp.agents.thetvdb://153021/2/9?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,198,198,'com.plexapp.agents.thetvdb://194031/1/10?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,526,526,'com.plexapp.agents.thetvdb://71256/12/92?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,923,923,'com.plexapp.agents.thetvdb://71256/15/16?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1008,1008,'com.plexapp.agents.thetvdb://71256/15/93?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1053,1053,'com.plexapp.agents.thetvdb://71256/16/21?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1068,1068,'com.plexapp.agents.thetvdb://71256/16/35?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1235,1235,'com.plexapp.agents.thetvdb://71256/17/44?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1255,1255,'com.plexapp.agents.thetvdb://71256/17/62?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1573,1573,'com.plexapp.agents.thetvdb://71663/20/9?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1580,1580,'com.plexapp.agents.thetvdb://71663/21/16?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2000,2000,'com.plexapp.agents.thetvdb://73141/9/8?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2107,2107,'com.plexapp.agents.thetvdb://73244/6/17?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2256,2256,'com.plexapp.agents.thetvdb://74845/4/7?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2408,2408,'com.plexapp.agents.thetvdb://75978/2/21?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2634,2634,'com.plexapp.agents.thetvdb://79126/1/1?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2962,2962,'com.plexapp.agents.thetvdb://79274/3/94?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3160,3160,'com.plexapp.agents.thetvdb://79274/5/129?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3161,3161,'com.plexapp.agents.thetvdb://79274/5/12?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3688,3688,'com.plexapp.agents.thetvdb://79274/8/62?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3714,3714,'com.plexapp.agents.thetvdb://79274/8/86?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,4002,4002,'com.plexapp.agents.thetvdb://79590/13/17?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,4215,4215,'com.plexapp.agents.thetvdb://80727/3/6?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,4381,4381,'com.plexapp.agents.thetvdb://83462/3/24?lang=en');
- INSERT INTO sqlite_stat3 VALUES('settings','s_account_id',4740,0,0,1);
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,1879,1879,'1113f632ccd52ec8b8d7ca3d6d56da4701e48018');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,2721,2721,'1936154b97bb5567163edaebc2806830ae419ccf');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,3035,3035,'1c122331d4b7bfa0dc2c003ab5fb4f7152b9987a');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,3393,3393,'1f81bdbc9acc3321dc592b1a109ca075731b549a');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,6071,6070,'393cf7713efb4519c7a3d1d5403f0d945d15a16a');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,7462,7461,'4677dd37011f8bd9ae7fbbdd3af6dcd8a5b4ab2d');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,8435,8434,'4ffa339485334e81a5e12e03a63b6508d76401cf');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,8716,8714,'52a093852e6599dd5004857b7ff5b5b82c7cdb25');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,9107,9104,'561183e39f866d97ec728e9ff16ac4ad01466111');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,10942,10939,'66e99b72e29610f49499ae09ee04a376210d1f08');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,12143,12139,'71f0602427e173dc2c551535f73fdb6885fe4302');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,14962,14958,'8ca8e4dfba696019830c19ab8a32c7ece9d8534b');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,15179,15174,'8ebf1a5cf33f8ada1fc5853ac06ac4d7e074f825');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,15375,15370,'908bc211bebdf21c79d2d2b54ebaa442ac1f5cae');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,18215,18210,'ab29e4e18ec5a14fef95aa713d69e31c045a22c1');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,18615,18610,'ae84c008cc0c338bf4f28d798a88575746452f6d');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,18649,18644,'aec7c901353e115aa5307e94018ba7507bec3a45');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,19517,19512,'b75025fbf2e9c504e3c1197ff1b69250402a31f8');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,21251,21245,'c7d32f0e3a8f3a0a3dbd00833833d2ccee62f0fd');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,23616,23610,'dd5ff61479a9bd4100de802515d9dcf72d46f07a');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,24287,24280,'e3db00034301b7555419d4ef6f64769298d5845e');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,24949,24942,'ea336abd197ecd7013854a25a4f4eb9dea7927c6');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,25574,25567,'f018ea5182ec3f32768ca1c3cefbf3ad160ec20b');
- INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,26139,26132,'f53709a8d81c12cb0f4f8d58004a25dd063de67c');
- INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',25167,0,0,2);
- INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',736,25167,1,3);
- INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',15,25903,2,4);
- INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',1398,25918,3,5);
- INSERT INTO sqlite_stat3 VALUES('items','i_deleted_at',27316,0,0,NULL);
- INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',2149,0,0,1);
- INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',411,2149,1,2);
- INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',1440,2560,2,3);
- INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',23316,4000,3,4);
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,215,215,'com.plexapp.agents.imdb://tt0065702?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,711,711,'com.plexapp.agents.imdb://tt0198781?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,987,986,'com.plexapp.agents.imdb://tt0454876?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1004,1002,'com.plexapp.agents.imdb://tt0464154?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1056,1053,'com.plexapp.agents.imdb://tt0499549?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1120,1116,'com.plexapp.agents.imdb://tt0903624?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1250,1245,'com.plexapp.agents.imdb://tt1268799?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1270,1264,'com.plexapp.agents.imdb://tt1320261?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1376,1369,'com.plexapp.agents.imdb://tt1772341?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,3035,3027,'com.plexapp.agents.thetvdb://153021/3/14?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,6071,6063,'com.plexapp.agents.thetvdb://71173/1/18?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,6342,6334,'com.plexapp.agents.thetvdb://71256/13/4?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,9107,9099,'com.plexapp.agents.thetvdb://72389/2/19?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,11740,11732,'com.plexapp.agents.thetvdb://73893/2/13?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,12143,12135,'com.plexapp.agents.thetvdb://73976/4/23?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,15179,15171,'com.plexapp.agents.thetvdb://75897/16/12?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,17408,17400,'com.plexapp.agents.thetvdb://76808/2/16?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,17984,17976,'com.plexapp.agents.thetvdb://77068/1/16?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,18215,18207,'com.plexapp.agents.thetvdb://77259/1/1?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,21251,21243,'com.plexapp.agents.thetvdb://78957/8/2?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,24287,24279,'com.plexapp.agents.thetvdb://80337/5/8?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,25513,25505,'com.plexapp.agents.thetvdb://82226/6?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,25548,25540,'com.plexapp.agents.thetvdb://82339/2/10?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,26770,26762,'com.plexapp.agents.thetvdb://86901/1/3?lang=en');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1524,0,0,'');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',2,3034,1391,'Attack of the Giant Squid');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',51,4742,2895,'Brad Sherwood');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',11,4912,2996,'Brian Williams');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',39,5847,3857,'Chip Esten');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,6071,4015,'Chuck Versus the DeLorean');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',12,7625,5436,'Denny Siegel');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',30,8924,6618,'Episode 1');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',29,9015,6629,'Episode 2');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',32,9082,6643,'Episode 3');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',28,9135,6654,'Episode 4');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',26,9183,6665,'Episode 5');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',27,9229,6677,'Episode 6');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',22,9266,6688,'Episode 7');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',20,9298,6699,'Episode 8');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',55,11750,8817,'Greg Proops');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,12143,9120,'Hardware Jungle');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',33,14712,11435,'Kathy Greenwood');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',3,15179,11840,'Last Call');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,18215,14601,'Nature or Nurture?');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',12,18241,14623,'Neil DeGrasse Tyson');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',68,19918,16144,'Pilot');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',7,21251,17298,'Reza Aslan');
- INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,24287,20035,'Technoviking');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',1524,0,0,'');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',1,3035,1429,'Anderson Can''t Dance');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',51,4782,2991,'Brad Sherwood');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',11,4936,3079,'Brian Williams');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',39,5694,3783,'Chip Esten');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',1,6071,4100,'Clive Warren');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',12,7144,5078,'Denny Siegel');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',30,8249,6097,'Episode 1');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',29,8340,6108,'Episode 2');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',32,8407,6122,'Episode 3');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',28,8460,6133,'Episode 4');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',26,8508,6144,'Episode 5');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',27,8554,6156,'Episode 6');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',22,8591,6167,'Episode 7');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',20,8623,6178,'Episode 8');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',1,9107,6537,'Fat Albert and the Cosby Kids');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',55,10539,7843,'Greg Proops');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',1,12143,9276,'Iron Age Remains');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',33,13118,10143,'Kathy Greenwood');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',1,15179,11972,'Mink');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',68,17411,14035,'Pilot');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',2,18214,14727,'Reflections');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',4,21250,17481,'The Apartment');
- INSERT INTO sqlite_stat3 VALUES('items','i_title',1,24287,20283,'The Simpsons Already Did It');
- INSERT INTO sqlite_stat3 VALUES('items','i_index',4315,95,2,1);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',1553,4410,3,2);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',1485,5963,4,3);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',1414,7448,5,4);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',1367,8862,6,5);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',1328,10229,7,6);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',1161,11557,8,7);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',1108,12718,9,8);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',1033,13826,10,9);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',1014,14859,11,10);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',929,15873,12,11);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',906,16802,13,12);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',844,17708,14,13);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',690,18552,15,14);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',655,19242,16,15);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',625,19897,17,16);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',579,20522,18,17);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',555,21101,19,18);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',526,21656,20,19);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',501,22182,21,20);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',459,22683,22,21);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',439,23142,23,22);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',315,23581,24,23);
- INSERT INTO sqlite_stat3 VALUES('items','i_index',192,24177,26,25);
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1851,0,0,NULL);
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',373,1857,2,'2011-10-22 14:54:39');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',595,2230,3,'2011-10-22 14:54:41');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',337,2825,4,'2011-10-22 14:54:43');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',361,3378,8,'2011-10-22 14:54:54');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',160,3739,9,'2011-10-22 14:54:56');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',315,4000,11,'2011-10-22 14:54:59');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',321,4334,13,'2011-10-22 14:55:02');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1292,4723,16,'2011-10-22 14:55:06');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',161,6015,17,'2011-10-22 14:55:07');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1,9107,2677,'2012-09-04 18:07:50');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',313,9717,3270,'2012-10-18 16:50:21');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',450,10030,3271,'2012-10-18 16:50:22');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',389,10668,3275,'2012-10-18 16:50:26');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',796,11057,3276,'2012-10-18 16:51:06');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',161,12041,3280,'2012-10-19 19:52:37');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',135,13281,4186,'2013-02-19 00:56:10');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1063,13416,4187,'2013-02-19 00:56:11');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',797,14479,4188,'2013-02-19 00:56:13');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',147,15276,4189,'2013-02-19 00:56:15');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',346,15423,4190,'2013-02-19 00:56:16');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1,18215,6436,'2013-05-05 14:09:54');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',2,21251,8122,'2013-05-24 15:25:45');
- INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1,24287,11116,'2013-05-26 14:17:39');
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',2560,0,0,NULL);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',18,3022,31,2350);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',10,6068,285,8150);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',158,6346,315,8949);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',34,9094,562,18831);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',20,12139,794,22838);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',134,14033,886,24739);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',159,14167,887,24740);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,14326,888,24741);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,14487,889,24742);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',124,14648,890,24743);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',157,14772,891,24744);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',126,15043,894,24747);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',40,15169,895,24748);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,15243,898,24753);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',138,15404,899,24754);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',160,15542,900,24755);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,15702,901,24756);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,15863,902,24757);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',124,16024,903,24758);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',155,16148,904,24759);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',26,18208,1043,29704);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',2,21251,1282,32952);
- INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',13,24279,1583,36068);
- INSERT INTO sqlite_stat3 VALUES('items','i_secid',25167,0,0,2);
- INSERT INTO sqlite_stat3 VALUES('items','i_secid',736,25167,1,3);
- INSERT INTO sqlite_stat3 VALUES('items','i_secid',15,25903,2,4);
- INSERT INTO sqlite_stat3 VALUES('items','i_secid',1398,25918,3,5);
- ANALYZE sqlite_master;
-
- explain query plan
- select items.title
- from items
- join items as child on child.parent_id=items.id
- join items as grandchild on grandchild.parent_id=child.id
- join settings
- on settings.guid=grandchild.guid
- and settings.account_id=1
- where items.metadata_type=2
- and items.secid=2
- and settings.last_viewed_at is not null
- group by items.id
- order by settings.last_viewed_at desc
- limit 10;
-} [list \
- 0 0 3 {SEARCH TABLE settings USING INDEX s_account_id (account_id=?)} \
- 0 1 2 {SEARCH TABLE items AS grandchild USING INDEX i_guid (guid=?)} \
- 0 2 1 {SEARCH TABLE items AS child USING INTEGER PRIMARY KEY (rowid=?)} \
- 0 3 0 {SEARCH TABLE items USING INTEGER PRIMARY KEY (rowid=?)} \
- 0 0 0 {USE TEMP B-TREE FOR GROUP BY} \
- 0 0 0 {USE TEMP B-TREE FOR ORDER BY}]
-
-
-finish_test
Index: test/window1.test
==================================================================
--- test/window1.test
+++ test/window1.test
@@ -255,10 +255,13 @@
SELECT trim(x) OVER (ORDER BY y) FROM t1;
} {1 {trim() may not be used as a window function}}
do_catchsql_test 7.1.7 {
SELECT max(x) OVER abc FROM t1 WINDOW def AS (ORDER BY y);
} {1 {no such window: abc}}
+do_catchsql_test 7.1.8 {
+ SELECT row_number(x) OVER () FROM t1
+} {1 {wrong number of arguments to function row_number()}}
do_execsql_test 7.2 {
SELECT
lead(y) OVER win,
lead(y, 2) OVER win,
@@ -1165,21 +1168,151 @@
4 D cc 8.25 {} |
12 L cc 'xyZ' L |
11 K cc 'xyz' K |
}
+# 2019-07-18
+# Check-in [7ef7b23cbb1b9ace] (which was itself a fix for ticket
+# https://www.sqlite.org/src/info/1be72aab9) introduced a new problem
+# if the LHS of a BETWEEN operator is a WINDOW function. The problem
+# was found by (the recently enhanced) dbsqlfuzz.
+#
+do_execsql_test 30.0 {
+ DROP TABLE IF EXISTS t1;
+ CREATE TABLE t1(a, b, c);
+ INSERT INTO t1 VALUES('BB','aa',399);
+ SELECT
+ count () OVER win1 NOT BETWEEN 'a' AND 'mmm',
+ count () OVER win3
+ FROM t1
+ WINDOW win1 AS (ORDER BY a GROUPS BETWEEN 4 PRECEDING AND 1 FOLLOWING
+ EXCLUDE CURRENT ROW),
+ win2 AS (PARTITION BY b ORDER BY a),
+ win3 AS (win2 RANGE BETWEEN 5.2 PRECEDING AND true PRECEDING );
+} {1 1}
#-------------------------------------------------------------------------
-# Test that the SQL in ticket [c8d3b9f0a75] - CVE-2020-13871 - does not
-# cause a problem for this version.
-#
+reset_db
+do_execsql_test 31.1 {
+ CREATE TABLE t1(a, b);
+ CREATE TABLE t2(c, d);
+ CREATE TABLE t3(e, f);
+
+ INSERT INTO t1 VALUES(1, 1);
+ INSERT INTO t2 VALUES(1, 1);
+ INSERT INTO t3 VALUES(1, 1);
+}
+
+do_execsql_test 31.2 {
+ SELECT d IN (SELECT sum(c) OVER (ORDER BY e+c) FROM t3) FROM (
+ SELECT * FROM t2
+ );
+} {1}
+
+do_execsql_test 31.3 {
+ SELECT d IN (SELECT sum(c) OVER (PARTITION BY d ORDER BY e+c) FROM t3) FROM (
+ SELECT * FROM t2
+ );
+} {1}
+
+do_catchsql_test 31.3 {
+ SELECT d IN (
+ SELECT sum(c) OVER ( ROWS BETWEEN d FOLLOWING AND UNBOUNDED FOLLOWING)
+ FROM t3
+ )
+ FROM (
+ SELECT * FROM t2
+ );
+} {1 {frame starting offset must be a non-negative integer}}
+
+do_catchsql_test 31.3 {
+ SELECT d IN (
+ SELECT sum(c) OVER ( ROWS BETWEEN CURRENT ROW AND c FOLLOWING)
+ FROM t3
+ )
+ FROM (
+ SELECT * FROM t2
+ );
+} {1 {frame ending offset must be a non-negative integer}}
+
+# 2019-11-16 chromium issue 1025467
+db close
+sqlite3 db :memory:
+do_catchsql_test 32.10 {
+ CREATE VIEW a AS SELECT NULL INTERSECT SELECT NULL ORDER BY s() OVER R;
+ CREATE TABLE a0 AS SELECT 0;
+ ALTER TABLE a0 RENAME TO S;
+} {1 {error in view a: 1st ORDER BY term does not match any column in the result set}}
+
+reset_db
+do_execsql_test 33.1 {
+ CREATE TABLE t1(aa, bb);
+ INSERT INTO t1 VALUES(1, 2);
+ INSERT INTO t1 VALUES(5, 6);
+ CREATE TABLE t2(x);
+ INSERT INTO t2 VALUES(1);
+}
+do_execsql_test 33.2 {
+ SELECT (SELECT DISTINCT sum(aa) OVER() FROM t1 ORDER BY 1), x FROM t2
+ ORDER BY 1;
+} {6 1}
+
reset_db
-do_execsql_test 30.0 {
- CREATE TABLE a(b);
+do_execsql_test 34.1 {
+ CREATE TABLE t1(a,b,c);
+}
+do_execsql_test 34.2 {
+ SELECT avg(a) OVER (
+ ORDER BY (SELECT sum(b) OVER ()
+ FROM t1 ORDER BY (
+ SELECT total(d) OVER (ORDER BY c)
+ FROM (SELECT 1 AS d) ORDER BY 1
+ )
+ )
+ )
+ FROM t1;
}
-do_execsql_test 30.1 {
- SELECT(SELECT b FROM a GROUP BY b HAVING(NULL AND b IN((SELECT COUNT() OVER(ORDER BY b) = lead(b) OVER(ORDER BY 3.100000 * SUM(DISTINCT CASE WHEN b LIKE 'SM PACK' THEN b * b ELSE 0 END) / b))))) FROM a EXCEPT SELECT b FROM a ORDER BY b, b, b;
-}
+#-------------------------------------------------------------------------
+reset_db
+do_catchsql_test 35.0 {
+ SELECT * WINDOW f AS () ORDER BY name COLLATE nocase;
+} {1 {no tables specified}}
+
+do_catchsql_test 35.1 {
+ VALUES(1) INTERSECT SELECT * WINDOW f AS () ORDER BY x COLLATE nocase;
+} {1 {no tables specified}}
+
+do_execsql_test 35.2 {
+ CREATE TABLE t1(x);
+ INSERT INTO t1 VALUES(1), (2), (3);
+ VALUES(1) INTERSECT
+ SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
+} {1}
+
+do_execsql_test 35.3 {
+ VALUES(8) EXCEPT
+ SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
+} {8}
+
+do_execsql_test 35.4 {
+ VALUES(1) UNION
+ SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
+} {1 3 6}
+
+# 2019-12-07 gramfuzz find
+#
+do_execsql_test 36.10 {
+ VALUES(count(*)OVER());
+} {1}
+do_execsql_test 36.20 {
+ VALUES(count(*)OVER()),(2);
+} {1 2}
+do_execsql_test 36.30 {
+ VALUES(2),(count(*)OVER());
+} {2 1}
+do_execsql_test 36.40 {
+ VALUES(2),(3),(count(*)OVER()),(4),(5);
+} {2 3 1 4 5}
finish_test
Index: test/window2.tcl
==================================================================
--- test/window2.tcl
+++ test/window2.tcl
@@ -415,10 +415,39 @@
ORDER BY a
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) FROM t2 ORDER BY 1, 2;
}
+execsql_float_test 4.9 {
+ SELECT
+ rank() OVER win AS rank,
+ cume_dist() OVER win AS cume_dist FROM t1
+ WINDOW win AS (ORDER BY 1);
+}
+
+execsql_test 4.10 {
+ SELECT count(*) OVER (ORDER BY b) FROM t1
+}
+
+execsql_test 4.11 {
+ SELECT count(distinct a) FILTER (WHERE b='odd') FROM t1
+}
+
+==========
+
+execsql_test 5.0 {
+ DROP TABLE IF EXISTS t1;
+ CREATE TABLE t1(x INTEGER, y INTEGER);
+ INSERT INTO t1 VALUES(10, 1);
+ INSERT INTO t1 VALUES(20, 2);
+ INSERT INTO t1 VALUES(3, 3);
+ INSERT INTO t1 VALUES(2, 4);
+ INSERT INTO t1 VALUES(1, 5);
+}
+execsql_float_test 5.1 {
+ SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z;
+}
finish_test
Index: test/window2.test
==================================================================
--- test/window2.test
+++ test/window2.test
@@ -324,111 +324,610 @@
do_execsql_test 4.1 {
SELECT a, sum(b) OVER (
PARTITION BY (b%10)
ORDER BY b
) FROM t2 ORDER BY a;
-} {1 0 2 754 3 251 4 754 5 101 6 1247 7 132 8 266 9 6 10 950 11 667 12 1052 13 535 14 128 15 428 16 250 17 336 18 1122 19 368 20 6 21 1247 22 1000 23 92 24 368 25 584 26 320 27 1000 28 24 29 478 30 133 31 1049 32 1090 33 632 34 101 35 54 36 54 37 1049 38 450 39 145 40 354 41 21 42 764 43 754 44 424 45 1122 46 930 47 42 48 930 49 352 50 535 51 42 52 118 53 536 54 6 55 1122 56 86 57 770 58 255 59 50 60 52 61 950 62 75 63 354 64 2 65 536 66 160 67 352 68 536 69 54 70 675 71 276 72 950 73 868 74 678 75 667 76 4 77 1184 78 160 79 120 80 584 81 266 82 133 83 405 84 468 85 6 86 806 87 166 88 500 89 1090 90 552 91 251 92 27 93 424 94 687 95 1215 96 450 97 32 98 360 99 1052 100 868 101 2 102 66 103 754 104 450 105 145 106 5 107 687 108 24 109 302 110 806 111 251 112 42 113 24 114 30 115 128 116 128 117 50 118 1215 119 86 120 687 121 683 122 672 123 178 124 24 125 24 126 299 127 178 128 770 129 535 130 1052 131 270 132 255 133 675 134 632 135 266 136 6 137 21 138 930 139 411 140 754 141 133 142 340 143 535 144 46 145 250 146 132 147 132 148 354 149 500 150 770 151 276 152 360 153 354 154 27 155 552 156 552 157 602 158 266 159 1049 160 675 161 384 162 667 163 27 164 101 165 166 166 32 167 42 168 18 169 336 170 1122 171 276 172 1122 173 266 174 50 175 178 176 276 177 1247 178 6 179 1215 180 604 181 360 182 212 183 120 184 210 185 1090 186 10 187 1090 188 266 189 66 190 250 191 266 192 360 193 120 194 128 195 178 196 770 197 92 198 634 199 38 200 21}
+} {1 0 2 754 3 251 4 754 5 101 6 1247 7 132 8 266 9 6 10 950
+ 11 667 12 1052 13 535 14 128 15 428 16 250 17 336 18 1122
+ 19 368 20 6 21 1247 22 1000 23 92 24 368 25 584 26 320
+ 27 1000 28 24 29 478 30 133 31 1049 32 1090 33 632 34 101
+ 35 54 36 54 37 1049 38 450 39 145 40 354 41 21 42 764
+ 43 754 44 424 45 1122 46 930 47 42 48 930 49 352 50 535
+ 51 42 52 118 53 536 54 6 55 1122 56 86 57 770 58 255 59 50
+ 60 52 61 950 62 75 63 354 64 2 65 536 66 160 67 352 68 536
+ 69 54 70 675 71 276 72 950 73 868 74 678 75 667 76 4
+ 77 1184 78 160 79 120 80 584 81 266 82 133 83 405 84 468
+ 85 6 86 806 87 166 88 500 89 1090 90 552 91 251 92 27
+ 93 424 94 687 95 1215 96 450 97 32 98 360 99 1052 100 868
+ 101 2 102 66 103 754 104 450 105 145 106 5 107 687 108 24
+ 109 302 110 806 111 251 112 42 113 24 114 30 115 128 116 128
+ 117 50 118 1215 119 86 120 687 121 683 122 672 123 178 124 24
+ 125 24 126 299 127 178 128 770 129 535 130 1052 131 270
+ 132 255 133 675 134 632 135 266 136 6 137 21 138 930 139 411
+ 140 754 141 133 142 340 143 535 144 46 145 250 146 132
+ 147 132 148 354 149 500 150 770 151 276 152 360 153 354
+ 154 27 155 552 156 552 157 602 158 266 159 1049 160 675
+ 161 384 162 667 163 27 164 101 165 166 166 32 167 42 168 18
+ 169 336 170 1122 171 276 172 1122 173 266 174 50 175 178
+ 176 276 177 1247 178 6 179 1215 180 604 181 360 182 212
+ 183 120 184 210 185 1090 186 10 187 1090 188 266 189 66
+ 190 250 191 266 192 360 193 120 194 128 195 178 196 770
+ 197 92 198 634 199 38 200 21}
do_execsql_test 4.2 {
SELECT a, sum(b) OVER (
PARTITION BY (b%10)
ORDER BY b
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) FROM t2 ORDER BY a;
-} {1 0 2 754 3 251 4 754 5 101 6 1247 7 132 8 266 9 6 10 950 11 667 12 1052 13 535 14 128 15 428 16 250 17 336 18 1122 19 368 20 6 21 1247 22 1000 23 92 24 368 25 584 26 320 27 1000 28 24 29 478 30 133 31 1049 32 1090 33 632 34 101 35 54 36 54 37 1049 38 450 39 145 40 354 41 21 42 764 43 754 44 424 45 1122 46 930 47 42 48 930 49 352 50 535 51 42 52 118 53 536 54 6 55 1122 56 86 57 770 58 255 59 50 60 52 61 950 62 75 63 354 64 2 65 536 66 160 67 352 68 536 69 54 70 675 71 276 72 950 73 868 74 678 75 667 76 4 77 1184 78 160 79 120 80 584 81 266 82 133 83 405 84 468 85 6 86 806 87 166 88 500 89 1090 90 552 91 251 92 27 93 424 94 687 95 1215 96 450 97 32 98 360 99 1052 100 868 101 2 102 66 103 754 104 450 105 145 106 5 107 687 108 24 109 302 110 806 111 251 112 42 113 24 114 30 115 128 116 128 117 50 118 1215 119 86 120 687 121 683 122 672 123 178 124 24 125 24 126 299 127 178 128 770 129 535 130 1052 131 270 132 255 133 675 134 632 135 266 136 6 137 21 138 930 139 411 140 754 141 133 142 340 143 535 144 46 145 250 146 132 147 132 148 354 149 500 150 770 151 276 152 360 153 354 154 27 155 552 156 552 157 602 158 266 159 1049 160 675 161 384 162 667 163 27 164 101 165 166 166 32 167 42 168 18 169 336 170 1122 171 276 172 1122 173 266 174 50 175 178 176 276 177 1247 178 6 179 1215 180 604 181 360 182 212 183 120 184 210 185 1090 186 10 187 1090 188 266 189 66 190 250 191 266 192 360 193 120 194 128 195 178 196 770 197 92 198 634 199 38 200 21}
+} {1 0 2 754 3 251 4 754 5 101 6 1247 7 132 8 266 9 6 10 950
+ 11 667 12 1052 13 535 14 128 15 428 16 250 17 336 18 1122
+ 19 368 20 6 21 1247 22 1000 23 92 24 368 25 584 26 320
+ 27 1000 28 24 29 478 30 133 31 1049 32 1090 33 632 34 101
+ 35 54 36 54 37 1049 38 450 39 145 40 354 41 21 42 764
+ 43 754 44 424 45 1122 46 930 47 42 48 930 49 352 50 535
+ 51 42 52 118 53 536 54 6 55 1122 56 86 57 770 58 255 59 50
+ 60 52 61 950 62 75 63 354 64 2 65 536 66 160 67 352 68 536
+ 69 54 70 675 71 276 72 950 73 868 74 678 75 667 76 4
+ 77 1184 78 160 79 120 80 584 81 266 82 133 83 405 84 468
+ 85 6 86 806 87 166 88 500 89 1090 90 552 91 251 92 27
+ 93 424 94 687 95 1215 96 450 97 32 98 360 99 1052 100 868
+ 101 2 102 66 103 754 104 450 105 145 106 5 107 687 108 24
+ 109 302 110 806 111 251 112 42 113 24 114 30 115 128 116 128
+ 117 50 118 1215 119 86 120 687 121 683 122 672 123 178 124 24
+ 125 24 126 299 127 178 128 770 129 535 130 1052 131 270
+ 132 255 133 675 134 632 135 266 136 6 137 21 138 930 139 411
+ 140 754 141 133 142 340 143 535 144 46 145 250 146 132
+ 147 132 148 354 149 500 150 770 151 276 152 360 153 354
+ 154 27 155 552 156 552 157 602 158 266 159 1049 160 675
+ 161 384 162 667 163 27 164 101 165 166 166 32 167 42 168 18
+ 169 336 170 1122 171 276 172 1122 173 266 174 50 175 178
+ 176 276 177 1247 178 6 179 1215 180 604 181 360 182 212
+ 183 120 184 210 185 1090 186 10 187 1090 188 266 189 66
+ 190 250 191 266 192 360 193 120 194 128 195 178 196 770
+ 197 92 198 634 199 38 200 21}
do_execsql_test 4.3 {
SELECT b, sum(b) OVER (
ORDER BY b
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) FROM t2 ORDER BY b;
-} {0 0 1 1 1 2 2 4 2 6 2 8 3 11 3 14 4 18 5 23 6 29 7 36 7 43 7 50 8 58 8 66 8 74 9 83 9 92 9 101 10 111 11 122 11 133 12 145 12 157 12 169 13 182 13 195 14 209 15 224 15 239 15 254 16 270 16 286 16 302 17 319 19 338 20 358 21 379 21 400 22 422 22 444 23 467 23 490 23 513 24 537 25 562 26 588 26 614 26 640 27 667 27 694 28 722 29 751 29 780 29 809 30 839 30 869 30 899 31 930 31 961 32 993 33 1026 33 1059 33 1092 33 1125 33 1158 34 1192 34 1226 34 1260 34 1294 35 1329 35 1364 36 1400 36 1436 36 1472 36 1508 37 1545 37 1582 38 1620 38 1658 39 1697 39 1736 39 1775 40 1815 41 1856 41 1897 41 1938 42 1980 43 2023 43 2066 44 2110 44 2154 46 2200 46 2246 47 2293 47 2340 47 2387 47 2434 49 2483 50 2533 51 2584 52 2636 53 2689 54 2743 55 2798 55 2853 56 2909 56 2965 56 3021 57 3078 58 3136 58 3194 58 3252 58 3310 59 3369 59 3428 59 3487 59 3546 60 3606 61 3667 61 3728 62 3790 62 3852 63 3915 64 3979 65 4044 65 4109 65 4174 66 4240 67 4307 68 4375 69 4444 70 4514 72 4586 72 4658 72 4730 73 4803 73 4876 73 4949 74 5023 74 5097 74 5171 74 5245 74 5319 75 5394 75 5469 75 5544 76 5620 77 5697 77 5774 78 5852 78 5930 79 6009 80 6089 80 6169 81 6250 81 6331 81 6412 82 6494 83 6577 84 6661 84 6745 84 6829 84 6913 85 6998 85 7083 85 7168 86 7254 87 7341 87 7428 88 7516 89 7605 89 7694 89 7783 90 7873 90 7963 90 8053 91 8144 91 8235 91 8326 91 8417 91 8508 93 8601 93 8694 93 8787 94 8881 95 8976 95 9071 95 9166 96 9262 96 9358 96 9454 97 9551 97 9648 98 9746 98 9844 99 9943 99 10042 99 10141}
+} {0 0 1 1 1 2 2 4 2 6 2 8 3 11 3 14 4 18 5 23 6 29 7 36
+ 7 43 7 50 8 58 8 66 8 74 9 83 9 92 9 101 10 111 11 122
+ 11 133 12 145 12 157 12 169 13 182 13 195 14 209 15 224
+ 15 239 15 254 16 270 16 286 16 302 17 319 19 338 20 358
+ 21 379 21 400 22 422 22 444 23 467 23 490 23 513 24 537
+ 25 562 26 588 26 614 26 640 27 667 27 694 28 722 29 751
+ 29 780 29 809 30 839 30 869 30 899 31 930 31 961 32 993
+ 33 1026 33 1059 33 1092 33 1125 33 1158 34 1192 34 1226
+ 34 1260 34 1294 35 1329 35 1364 36 1400 36 1436 36 1472
+ 36 1508 37 1545 37 1582 38 1620 38 1658 39 1697 39 1736
+ 39 1775 40 1815 41 1856 41 1897 41 1938 42 1980 43 2023
+ 43 2066 44 2110 44 2154 46 2200 46 2246 47 2293 47 2340
+ 47 2387 47 2434 49 2483 50 2533 51 2584 52 2636 53 2689
+ 54 2743 55 2798 55 2853 56 2909 56 2965 56 3021 57 3078
+ 58 3136 58 3194 58 3252 58 3310 59 3369 59 3428 59 3487
+ 59 3546 60 3606 61 3667 61 3728 62 3790 62 3852 63 3915
+ 64 3979 65 4044 65 4109 65 4174 66 4240 67 4307 68 4375
+ 69 4444 70 4514 72 4586 72 4658 72 4730 73 4803 73 4876
+ 73 4949 74 5023 74 5097 74 5171 74 5245 74 5319 75 5394
+ 75 5469 75 5544 76 5620 77 5697 77 5774 78 5852 78 5930
+ 79 6009 80 6089 80 6169 81 6250 81 6331 81 6412 82 6494
+ 83 6577 84 6661 84 6745 84 6829 84 6913 85 6998 85 7083
+ 85 7168 86 7254 87 7341 87 7428 88 7516 89 7605 89 7694
+ 89 7783 90 7873 90 7963 90 8053 91 8144 91 8235 91 8326
+ 91 8417 91 8508 93 8601 93 8694 93 8787 94 8881 95 8976
+ 95 9071 95 9166 96 9262 96 9358 96 9454 97 9551 97 9648
+ 98 9746 98 9844 99 9943 99 10042 99 10141}
do_execsql_test 4.4 {
SELECT b, sum(b) OVER (
ORDER BY b
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) FROM t2 ORDER BY b;
-} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141 98 10141 99 10141 99 10141 99 10141}
+} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141
+ 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141
+ 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141
+ 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141
+ 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141
+ 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141
+ 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141
+ 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141
+ 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141
+ 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141
+ 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141
+ 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141
+ 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141
+ 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141
+ 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141
+ 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141
+ 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141
+ 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141
+ 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141
+ 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141
+ 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141
+ 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141
+ 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141
+ 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141
+ 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141
+ 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141
+ 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141
+ 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141
+ 98 10141 99 10141 99 10141 99 10141}
do_execsql_test 4.5 {
SELECT b, sum(b) OVER (
ORDER BY b
RANGE BETWEEN CURRENT ROW AND CURRENT ROW
) FROM t2 ORDER BY b;
-} {0 0 1 2 1 2 2 6 2 6 2 6 3 6 3 6 4 4 5 5 6 6 7 21 7 21 7 21 8 24 8 24 8 24 9 27 9 27 9 27 10 10 11 22 11 22 12 36 12 36 12 36 13 26 13 26 14 14 15 45 15 45 15 45 16 48 16 48 16 48 17 17 19 19 20 20 21 42 21 42 22 44 22 44 23 69 23 69 23 69 24 24 25 25 26 78 26 78 26 78 27 54 27 54 28 28 29 87 29 87 29 87 30 90 30 90 30 90 31 62 31 62 32 32 33 165 33 165 33 165 33 165 33 165 34 136 34 136 34 136 34 136 35 70 35 70 36 144 36 144 36 144 36 144 37 74 37 74 38 76 38 76 39 117 39 117 39 117 40 40 41 123 41 123 41 123 42 42 43 86 43 86 44 88 44 88 46 92 46 92 47 188 47 188 47 188 47 188 49 49 50 50 51 51 52 52 53 53 54 54 55 110 55 110 56 168 56 168 56 168 57 57 58 232 58 232 58 232 58 232 59 236 59 236 59 236 59 236 60 60 61 122 61 122 62 124 62 124 63 63 64 64 65 195 65 195 65 195 66 66 67 67 68 68 69 69 70 70 72 216 72 216 72 216 73 219 73 219 73 219 74 370 74 370 74 370 74 370 74 370 75 225 75 225 75 225 76 76 77 154 77 154 78 156 78 156 79 79 80 160 80 160 81 243 81 243 81 243 82 82 83 83 84 336 84 336 84 336 84 336 85 255 85 255 85 255 86 86 87 174 87 174 88 88 89 267 89 267 89 267 90 270 90 270 90 270 91 455 91 455 91 455 91 455 91 455 93 279 93 279 93 279 94 94 95 285 95 285 95 285 96 288 96 288 96 288 97 194 97 194 98 196 98 196 99 297 99 297 99 297}
+} {0 0 1 2 1 2 2 6 2 6 2 6 3 6 3 6 4 4 5 5 6 6 7 21
+ 7 21 7 21 8 24 8 24 8 24 9 27 9 27 9 27 10 10 11 22
+ 11 22 12 36 12 36 12 36 13 26 13 26 14 14 15 45 15 45
+ 15 45 16 48 16 48 16 48 17 17 19 19 20 20 21 42 21 42
+ 22 44 22 44 23 69 23 69 23 69 24 24 25 25 26 78 26 78
+ 26 78 27 54 27 54 28 28 29 87 29 87 29 87 30 90 30 90
+ 30 90 31 62 31 62 32 32 33 165 33 165 33 165 33 165 33 165
+ 34 136 34 136 34 136 34 136 35 70 35 70 36 144 36 144
+ 36 144 36 144 37 74 37 74 38 76 38 76 39 117 39 117 39 117
+ 40 40 41 123 41 123 41 123 42 42 43 86 43 86 44 88 44 88
+ 46 92 46 92 47 188 47 188 47 188 47 188 49 49 50 50 51 51
+ 52 52 53 53 54 54 55 110 55 110 56 168 56 168 56 168 57 57
+ 58 232 58 232 58 232 58 232 59 236 59 236 59 236 59 236
+ 60 60 61 122 61 122 62 124 62 124 63 63 64 64 65 195 65 195
+ 65 195 66 66 67 67 68 68 69 69 70 70 72 216 72 216 72 216
+ 73 219 73 219 73 219 74 370 74 370 74 370 74 370 74 370
+ 75 225 75 225 75 225 76 76 77 154 77 154 78 156 78 156
+ 79 79 80 160 80 160 81 243 81 243 81 243 82 82 83 83 84 336
+ 84 336 84 336 84 336 85 255 85 255 85 255 86 86 87 174
+ 87 174 88 88 89 267 89 267 89 267 90 270 90 270 90 270
+ 91 455 91 455 91 455 91 455 91 455 93 279 93 279 93 279
+ 94 94 95 285 95 285 95 285 96 288 96 288 96 288 97 194
+ 97 194 98 196 98 196 99 297 99 297 99 297}
do_execsql_test 4.6.1 {
SELECT b, sum(b) OVER (
RANGE BETWEEN CURRENT ROW AND CURRENT ROW
) FROM t2 ORDER BY b;
-} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141 98 10141 99 10141 99 10141 99 10141}
+} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141
+ 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141
+ 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141
+ 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141
+ 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141
+ 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141
+ 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141
+ 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141
+ 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141
+ 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141
+ 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141
+ 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141
+ 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141
+ 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141
+ 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141
+ 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141
+ 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141
+ 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141
+ 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141
+ 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141
+ 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141
+ 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141
+ 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141
+ 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141
+ 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141
+ 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141
+ 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141
+ 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141
+ 98 10141 99 10141 99 10141 99 10141}
do_execsql_test 4.6.2 {
SELECT b, sum(b) OVER () FROM t2 ORDER BY b;
-} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141 98 10141 99 10141 99 10141 99 10141}
+} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141
+ 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141
+ 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141
+ 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141
+ 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141
+ 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141
+ 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141
+ 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141
+ 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141
+ 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141
+ 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141
+ 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141
+ 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141
+ 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141
+ 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141
+ 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141
+ 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141
+ 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141
+ 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141
+ 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141
+ 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141
+ 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141
+ 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141
+ 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141
+ 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141
+ 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141
+ 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141
+ 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141
+ 98 10141 99 10141 99 10141 99 10141}
do_execsql_test 4.6.3 {
SELECT b, sum(b) OVER (
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) FROM t2 ORDER BY b;
-} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141 98 10141 99 10141 99 10141 99 10141}
+} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141
+ 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141
+ 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141
+ 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141
+ 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141
+ 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141
+ 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141
+ 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141
+ 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141
+ 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141
+ 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141
+ 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141
+ 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141
+ 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141
+ 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141
+ 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141
+ 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141
+ 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141
+ 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141
+ 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141
+ 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141
+ 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141
+ 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141
+ 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141
+ 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141
+ 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141
+ 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141
+ 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141
+ 98 10141 99 10141 99 10141 99 10141}
do_execsql_test 4.6.4 {
SELECT b, sum(b) OVER (
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) FROM t2 ORDER BY b;
-} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141 98 10141 99 10141 99 10141 99 10141}
+} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141
+ 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141
+ 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141
+ 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141
+ 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141
+ 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141
+ 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141
+ 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141
+ 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141
+ 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141
+ 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141
+ 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141
+ 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141
+ 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141
+ 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141
+ 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141
+ 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141
+ 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141
+ 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141
+ 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141
+ 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141
+ 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141
+ 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141
+ 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141
+ 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141
+ 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141
+ 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141
+ 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141
+ 98 10141 99 10141 99 10141 99 10141}
do_execsql_test 4.7.1 {
SELECT b, sum(b) OVER (
ROWS BETWEEN CURRENT ROW AND CURRENT ROW
) FROM t2 ORDER BY 1, 2;
-} {0 0 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 5 5 6 6 7 7 7 7 7 7 8 8 8 8 8 8 9 9 9 9 9 9 10 10 11 11 11 11 12 12 12 12 12 12 13 13 13 13 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17 19 19 20 20 21 21 21 21 22 22 22 22 23 23 23 23 23 23 24 24 25 25 26 26 26 26 26 26 27 27 27 27 28 28 29 29 29 29 29 29 30 30 30 30 30 30 31 31 31 31 32 32 33 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 34 34 35 35 35 35 36 36 36 36 36 36 36 36 37 37 37 37 38 38 38 38 39 39 39 39 39 39 40 40 41 41 41 41 41 41 42 42 43 43 43 43 44 44 44 44 46 46 46 46 47 47 47 47 47 47 47 47 49 49 50 50 51 51 52 52 53 53 54 54 55 55 55 55 56 56 56 56 56 56 57 57 58 58 58 58 58 58 58 58 59 59 59 59 59 59 59 59 60 60 61 61 61 61 62 62 62 62 63 63 64 64 65 65 65 65 65 65 66 66 67 67 68 68 69 69 70 70 72 72 72 72 72 72 73 73 73 73 73 73 74 74 74 74 74 74 74 74 74 74 75 75 75 75 75 75 76 76 77 77 77 77 78 78 78 78 79 79 80 80 80 80 81 81 81 81 81 81 82 82 83 83 84 84 84 84 84 84 84 84 85 85 85 85 85 85 86 86 87 87 87 87 88 88 89 89 89 89 89 89 90 90 90 90 90 90 91 91 91 91 91 91 91 91 91 91 93 93 93 93 93 93 94 94 95 95 95 95 95 95 96 96 96 96 96 96 97 97 97 97 98 98 98 98 99 99 99 99 99 99}
+} {0 0 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 5 5 6 6 7 7 7 7
+ 7 7 8 8 8 8 8 8 9 9 9 9 9 9 10 10 11 11 11 11 12 12
+ 12 12 12 12 13 13 13 13 14 14 15 15 15 15 15 15 16 16
+ 16 16 16 16 17 17 19 19 20 20 21 21 21 21 22 22 22 22
+ 23 23 23 23 23 23 24 24 25 25 26 26 26 26 26 26 27 27
+ 27 27 28 28 29 29 29 29 29 29 30 30 30 30 30 30 31 31
+ 31 31 32 32 33 33 33 33 33 33 33 33 33 33 34 34 34 34
+ 34 34 34 34 35 35 35 35 36 36 36 36 36 36 36 36 37 37
+ 37 37 38 38 38 38 39 39 39 39 39 39 40 40 41 41 41 41
+ 41 41 42 42 43 43 43 43 44 44 44 44 46 46 46 46 47 47
+ 47 47 47 47 47 47 49 49 50 50 51 51 52 52 53 53 54 54
+ 55 55 55 55 56 56 56 56 56 56 57 57 58 58 58 58 58 58
+ 58 58 59 59 59 59 59 59 59 59 60 60 61 61 61 61 62 62
+ 62 62 63 63 64 64 65 65 65 65 65 65 66 66 67 67 68 68
+ 69 69 70 70 72 72 72 72 72 72 73 73 73 73 73 73 74 74
+ 74 74 74 74 74 74 74 74 75 75 75 75 75 75 76 76 77 77
+ 77 77 78 78 78 78 79 79 80 80 80 80 81 81 81 81 81 81
+ 82 82 83 83 84 84 84 84 84 84 84 84 85 85 85 85 85 85
+ 86 86 87 87 87 87 88 88 89 89 89 89 89 89 90 90 90 90
+ 90 90 91 91 91 91 91 91 91 91 91 91 93 93 93 93 93 93
+ 94 94 95 95 95 95 95 95 96 96 96 96 96 96 97 97 97 97
+ 98 98 98 98 99 99 99 99 99 99}
do_execsql_test 4.7.2 {
SELECT b, sum(b) OVER (
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) FROM t2 ORDER BY 1, 2;
-} {0 0 1 3379 1 5443 2 372 2 4473 2 7074 3 2916 3 9096 4 4049 5 5643 6 1047 7 2205 7 7081 7 10141 8 1553 8 5926 8 6422 9 4883 9 7932 9 8497 10 9544 11 5727 11 6433 12 2825 12 5918 12 8582 13 5190 13 8570 14 8596 15 3189 15 6023 15 8924 16 1942 16 1958 16 3590 17 10134 19 7474 20 5946 21 5464 21 9682 22 3029 22 6140 23 212 23 1926 23 8520 24 2626 25 3331 26 337 26 7539 26 7565 27 1270 27 10035 28 3217 29 1649 29 4355 29 7326 30 4215 30 9400 30 9853 31 5977 31 6008 32 2857 33 370 33 4326 33 8175 33 8909 33 9661 34 6414 34 6516 34 8958 34 9925 35 2151 35 5638 36 3701 36 7818 36 8785 36 8994 37 4597 37 8557 38 735 38 9891 39 842 39 7513 39 9721 40 3475 41 115 41 4874 41 5906 42 4185 43 2754 43 3518 44 7072 44 9765 46 1041 46 1316 47 2198 47 3378 47 7612 47 7923 49 6482 50 9450 51 5778 52 9370 53 4408 54 1448 55 3174 55 6876 56 2913 56 3435 56 3574 57 7223 58 5248 58 7876 58 9318 58 9823 59 697 59 2813 59 6665 59 7455 60 6821 61 2426 61 4944 62 904 62 8658 63 4471 64 8407 65 2116 65 5177 65 5603 66 8142 67 1620 68 803 69 9260 70 7396 72 4833 72 8004 72 8076 73 5017 73 5716 73 6213 74 74 74 189 74 2365 74 5538 74 7297 75 3665 75 6951 75 8343 76 3964 77 1903 77 7028 78 1394 78 4293 79 6292 80 4677 80 7692 81 542 81 4045 81 8488 82 10117 83 10008 84 1826 84 4761 84 9534 84 9628 85 2602 85 2711 85 7166 86 2291 87 4560 87 5865 88 6380 89 461 89 3306 89 3790 90 3119 90 6606 90 7782 91 995 91 2517 91 3007 91 8749 91 8876 93 1742 93 2051 93 8268 94 4143 95 5112 95 6118 95 9191 96 638 96 5344 96 6761 97 1243 97 1545 98 3888 98 5442 99 311 99 1146 99 9093}
+} {0 0 1 3379 1 5443 2 372 2 4473 2 7074 3 2916 3 9096 4 4049
+ 5 5643 6 1047 7 2205 7 7081 7 10141 8 1553 8 5926 8 6422
+ 9 4883 9 7932 9 8497 10 9544 11 5727 11 6433 12 2825 12 5918
+ 12 8582 13 5190 13 8570 14 8596 15 3189 15 6023 15 8924
+ 16 1942 16 1958 16 3590 17 10134 19 7474 20 5946 21 5464
+ 21 9682 22 3029 22 6140 23 212 23 1926 23 8520 24 2626
+ 25 3331 26 337 26 7539 26 7565 27 1270 27 10035 28 3217
+ 29 1649 29 4355 29 7326 30 4215 30 9400 30 9853 31 5977
+ 31 6008 32 2857 33 370 33 4326 33 8175 33 8909 33 9661
+ 34 6414 34 6516 34 8958 34 9925 35 2151 35 5638 36 3701
+ 36 7818 36 8785 36 8994 37 4597 37 8557 38 735 38 9891 39 842
+ 39 7513 39 9721 40 3475 41 115 41 4874 41 5906 42 4185
+ 43 2754 43 3518 44 7072 44 9765 46 1041 46 1316 47 2198
+ 47 3378 47 7612 47 7923 49 6482 50 9450 51 5778 52 9370
+ 53 4408 54 1448 55 3174 55 6876 56 2913 56 3435 56 3574
+ 57 7223 58 5248 58 7876 58 9318 58 9823 59 697 59 2813
+ 59 6665 59 7455 60 6821 61 2426 61 4944 62 904 62 8658
+ 63 4471 64 8407 65 2116 65 5177 65 5603 66 8142 67 1620
+ 68 803 69 9260 70 7396 72 4833 72 8004 72 8076 73 5017
+ 73 5716 73 6213 74 74 74 189 74 2365 74 5538 74 7297 75 3665
+ 75 6951 75 8343 76 3964 77 1903 77 7028 78 1394 78 4293
+ 79 6292 80 4677 80 7692 81 542 81 4045 81 8488 82 10117
+ 83 10008 84 1826 84 4761 84 9534 84 9628 85 2602 85 2711
+ 85 7166 86 2291 87 4560 87 5865 88 6380 89 461 89 3306
+ 89 3790 90 3119 90 6606 90 7782 91 995 91 2517 91 3007
+ 91 8749 91 8876 93 1742 93 2051 93 8268 94 4143 95 5112
+ 95 6118 95 9191 96 638 96 5344 96 6761 97 1243 97 1545
+ 98 3888 98 5442 99 311 99 1146 99 9093}
do_execsql_test 4.7.3 {
SELECT b, sum(b) OVER (
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) FROM t2 ORDER BY 1, 2;
-} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141 98 10141 99 10141 99 10141 99 10141}
+} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141
+ 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141
+ 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141
+ 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141
+ 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141
+ 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141
+ 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141
+ 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141
+ 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141
+ 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141
+ 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141
+ 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141
+ 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141
+ 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141
+ 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141
+ 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141
+ 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141
+ 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141
+ 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141
+ 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141
+ 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141
+ 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141
+ 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141
+ 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141
+ 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141
+ 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141
+ 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141
+ 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141
+ 98 10141 99 10141 99 10141 99 10141}
do_execsql_test 4.7.4 {
SELECT b, sum(b) OVER (
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) FROM t2 ORDER BY 1, 2;
-} {0 10141 1 4699 1 6763 2 3069 2 5670 2 9771 3 1048 3 7228 4 6096 5 4503 6 9100 7 7 7 3067 7 7943 8 3727 8 4223 8 8596 9 1653 9 2218 9 5267 10 607 11 3719 11 4425 12 1571 12 4235 12 7328 13 1584 13 4964 14 1559 15 1232 15 4133 15 6967 16 6567 16 8199 16 8215 17 24 19 2686 20 4215 21 480 21 4698 22 4023 22 7134 23 1644 23 8238 23 9952 24 7539 25 6835 26 2602 26 2628 26 9830 27 133 27 8898 28 6952 29 2844 29 5815 29 8521 30 318 30 771 30 5956 31 4164 31 4195 32 7316 33 513 33 1265 33 1999 33 5848 33 9804 34 250 34 1217 34 3659 34 3761 35 4538 35 8025 36 1183 36 1392 36 2359 36 6476 37 1621 37 5581 38 288 38 9444 39 459 39 2667 39 9338 40 6706 41 4276 41 5308 41 10067 42 5998 43 6666 43 7430 44 420 44 3113 46 8871 46 9146 47 2265 47 2576 47 6810 47 7990 49 3708 50 741 51 4414 52 823 53 5786 54 8747 55 3320 55 7022 56 6623 56 6762 56 7284 57 2975 58 376 58 881 58 2323 58 4951 59 2745 59 3535 59 7387 59 9503 60 3380 61 5258 61 7776 62 1545 62 9299 63 5733 64 1798 65 4603 65 5029 65 8090 66 2065 67 8588 68 9406 69 950 70 2815 72 2137 72 2209 72 5380 73 4001 73 4498 73 5197 74 2918 74 4677 74 7850 74 10026 74 10141 75 1873 75 3265 75 6551 76 6253 77 3190 77 8315 78 5926 78 8825 79 3928 80 2529 80 5544 81 1734 81 6177 81 9680 82 106 83 216 84 597 84 691 84 5464 84 8399 85 3060 85 7515 85 7624 86 7936 87 4363 87 5668 88 3849 89 6440 89 6924 89 9769 90 2449 90 3625 90 7112 91 1356 91 1483 91 7225 91 7715 91 9237 93 1966 93 8183 93 8492 94 6092 95 1045 95 4118 95 5124 96 3476 96 4893 96 9599 97 8693 97 8995 98 4797 98 6351 99 1147 99 9094 99 9929}
+} {0 10141 1 4699 1 6763 2 3069 2 5670 2 9771 3 1048 3 7228
+ 4 6096 5 4503 6 9100 7 7 7 3067 7 7943 8 3727 8 4223 8 8596
+ 9 1653 9 2218 9 5267 10 607 11 3719 11 4425 12 1571 12 4235
+ 12 7328 13 1584 13 4964 14 1559 15 1232 15 4133 15 6967
+ 16 6567 16 8199 16 8215 17 24 19 2686 20 4215 21 480 21 4698
+ 22 4023 22 7134 23 1644 23 8238 23 9952 24 7539 25 6835
+ 26 2602 26 2628 26 9830 27 133 27 8898 28 6952 29 2844
+ 29 5815 29 8521 30 318 30 771 30 5956 31 4164 31 4195 32 7316
+ 33 513 33 1265 33 1999 33 5848 33 9804 34 250 34 1217 34 3659
+ 34 3761 35 4538 35 8025 36 1183 36 1392 36 2359 36 6476
+ 37 1621 37 5581 38 288 38 9444 39 459 39 2667 39 9338 40 6706
+ 41 4276 41 5308 41 10067 42 5998 43 6666 43 7430 44 420
+ 44 3113 46 8871 46 9146 47 2265 47 2576 47 6810 47 7990
+ 49 3708 50 741 51 4414 52 823 53 5786 54 8747 55 3320 55 7022
+ 56 6623 56 6762 56 7284 57 2975 58 376 58 881 58 2323 58 4951
+ 59 2745 59 3535 59 7387 59 9503 60 3380 61 5258 61 7776
+ 62 1545 62 9299 63 5733 64 1798 65 4603 65 5029 65 8090
+ 66 2065 67 8588 68 9406 69 950 70 2815 72 2137 72 2209
+ 72 5380 73 4001 73 4498 73 5197 74 2918 74 4677 74 7850
+ 74 10026 74 10141 75 1873 75 3265 75 6551 76 6253 77 3190
+ 77 8315 78 5926 78 8825 79 3928 80 2529 80 5544 81 1734
+ 81 6177 81 9680 82 106 83 216 84 597 84 691 84 5464 84 8399
+ 85 3060 85 7515 85 7624 86 7936 87 4363 87 5668 88 3849
+ 89 6440 89 6924 89 9769 90 2449 90 3625 90 7112 91 1356
+ 91 1483 91 7225 91 7715 91 9237 93 1966 93 8183 93 8492
+ 94 6092 95 1045 95 4118 95 5124 96 3476 96 4893 96 9599
+ 97 8693 97 8995 98 4797 98 6351 99 1147 99 9094 99 9929}
do_execsql_test 4.8.1 {
SELECT b, sum(b) OVER (
ORDER BY a
ROWS BETWEEN CURRENT ROW AND CURRENT ROW
) FROM t2 ORDER BY 1, 2;
-} {0 0 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 5 5 6 6 7 7 7 7 7 7 8 8 8 8 8 8 9 9 9 9 9 9 10 10 11 11 11 11 12 12 12 12 12 12 13 13 13 13 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17 19 19 20 20 21 21 21 21 22 22 22 22 23 23 23 23 23 23 24 24 25 25 26 26 26 26 26 26 27 27 27 27 28 28 29 29 29 29 29 29 30 30 30 30 30 30 31 31 31 31 32 32 33 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 34 34 35 35 35 35 36 36 36 36 36 36 36 36 37 37 37 37 38 38 38 38 39 39 39 39 39 39 40 40 41 41 41 41 41 41 42 42 43 43 43 43 44 44 44 44 46 46 46 46 47 47 47 47 47 47 47 47 49 49 50 50 51 51 52 52 53 53 54 54 55 55 55 55 56 56 56 56 56 56 57 57 58 58 58 58 58 58 58 58 59 59 59 59 59 59 59 59 60 60 61 61 61 61 62 62 62 62 63 63 64 64 65 65 65 65 65 65 66 66 67 67 68 68 69 69 70 70 72 72 72 72 72 72 73 73 73 73 73 73 74 74 74 74 74 74 74 74 74 74 75 75 75 75 75 75 76 76 77 77 77 77 78 78 78 78 79 79 80 80 80 80 81 81 81 81 81 81 82 82 83 83 84 84 84 84 84 84 84 84 85 85 85 85 85 85 86 86 87 87 87 87 88 88 89 89 89 89 89 89 90 90 90 90 90 90 91 91 91 91 91 91 91 91 91 91 93 93 93 93 93 93 94 94 95 95 95 95 95 95 96 96 96 96 96 96 97 97 97 97 98 98 98 98 99 99 99 99 99 99}
+} {0 0 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 5 5 6 6 7 7 7 7
+ 7 7 8 8 8 8 8 8 9 9 9 9 9 9 10 10 11 11 11 11 12 12
+ 12 12 12 12 13 13 13 13 14 14 15 15 15 15 15 15 16 16
+ 16 16 16 16 17 17 19 19 20 20 21 21 21 21 22 22 22 22
+ 23 23 23 23 23 23 24 24 25 25 26 26 26 26 26 26 27 27
+ 27 27 28 28 29 29 29 29 29 29 30 30 30 30 30 30 31 31
+ 31 31 32 32 33 33 33 33 33 33 33 33 33 33 34 34 34 34
+ 34 34 34 34 35 35 35 35 36 36 36 36 36 36 36 36 37 37
+ 37 37 38 38 38 38 39 39 39 39 39 39 40 40 41 41 41 41
+ 41 41 42 42 43 43 43 43 44 44 44 44 46 46 46 46 47 47
+ 47 47 47 47 47 47 49 49 50 50 51 51 52 52 53 53 54 54
+ 55 55 55 55 56 56 56 56 56 56 57 57 58 58 58 58 58 58
+ 58 58 59 59 59 59 59 59 59 59 60 60 61 61 61 61 62 62
+ 62 62 63 63 64 64 65 65 65 65 65 65 66 66 67 67 68 68
+ 69 69 70 70 72 72 72 72 72 72 73 73 73 73 73 73 74 74
+ 74 74 74 74 74 74 74 74 75 75 75 75 75 75 76 76 77 77
+ 77 77 78 78 78 78 79 79 80 80 80 80 81 81 81 81 81 81
+ 82 82 83 83 84 84 84 84 84 84 84 84 85 85 85 85 85 85
+ 86 86 87 87 87 87 88 88 89 89 89 89 89 89 90 90 90 90
+ 90 90 91 91 91 91 91 91 91 91 91 91 93 93 93 93 93 93
+ 94 94 95 95 95 95 95 95 96 96 96 96 96 96 97 97 97 97
+ 98 98 98 98 99 99 99 99 99 99}
do_execsql_test 4.8.2 {
SELECT b, sum(b) OVER (
ORDER BY a
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) FROM t2 ORDER BY 1, 2;
-} {0 0 1 3379 1 5443 2 372 2 4473 2 7074 3 2916 3 9096 4 4049 5 5643 6 1047 7 2205 7 7081 7 10141 8 1553 8 5926 8 6422 9 4883 9 7932 9 8497 10 9544 11 5727 11 6433 12 2825 12 5918 12 8582 13 5190 13 8570 14 8596 15 3189 15 6023 15 8924 16 1942 16 1958 16 3590 17 10134 19 7474 20 5946 21 5464 21 9682 22 3029 22 6140 23 212 23 1926 23 8520 24 2626 25 3331 26 337 26 7539 26 7565 27 1270 27 10035 28 3217 29 1649 29 4355 29 7326 30 4215 30 9400 30 9853 31 5977 31 6008 32 2857 33 370 33 4326 33 8175 33 8909 33 9661 34 6414 34 6516 34 8958 34 9925 35 2151 35 5638 36 3701 36 7818 36 8785 36 8994 37 4597 37 8557 38 735 38 9891 39 842 39 7513 39 9721 40 3475 41 115 41 4874 41 5906 42 4185 43 2754 43 3518 44 7072 44 9765 46 1041 46 1316 47 2198 47 3378 47 7612 47 7923 49 6482 50 9450 51 5778 52 9370 53 4408 54 1448 55 3174 55 6876 56 2913 56 3435 56 3574 57 7223 58 5248 58 7876 58 9318 58 9823 59 697 59 2813 59 6665 59 7455 60 6821 61 2426 61 4944 62 904 62 8658 63 4471 64 8407 65 2116 65 5177 65 5603 66 8142 67 1620 68 803 69 9260 70 7396 72 4833 72 8004 72 8076 73 5017 73 5716 73 6213 74 74 74 189 74 2365 74 5538 74 7297 75 3665 75 6951 75 8343 76 3964 77 1903 77 7028 78 1394 78 4293 79 6292 80 4677 80 7692 81 542 81 4045 81 8488 82 10117 83 10008 84 1826 84 4761 84 9534 84 9628 85 2602 85 2711 85 7166 86 2291 87 4560 87 5865 88 6380 89 461 89 3306 89 3790 90 3119 90 6606 90 7782 91 995 91 2517 91 3007 91 8749 91 8876 93 1742 93 2051 93 8268 94 4143 95 5112 95 6118 95 9191 96 638 96 5344 96 6761 97 1243 97 1545 98 3888 98 5442 99 311 99 1146 99 9093}
+} {0 0 1 3379 1 5443 2 372 2 4473 2 7074 3 2916 3 9096 4 4049
+ 5 5643 6 1047 7 2205 7 7081 7 10141 8 1553 8 5926 8 6422
+ 9 4883 9 7932 9 8497 10 9544 11 5727 11 6433 12 2825 12 5918
+ 12 8582 13 5190 13 8570 14 8596 15 3189 15 6023 15 8924
+ 16 1942 16 1958 16 3590 17 10134 19 7474 20 5946 21 5464
+ 21 9682 22 3029 22 6140 23 212 23 1926 23 8520 24 2626
+ 25 3331 26 337 26 7539 26 7565 27 1270 27 10035 28 3217
+ 29 1649 29 4355 29 7326 30 4215 30 9400 30 9853 31 5977
+ 31 6008 32 2857 33 370 33 4326 33 8175 33 8909 33 9661
+ 34 6414 34 6516 34 8958 34 9925 35 2151 35 5638 36 3701
+ 36 7818 36 8785 36 8994 37 4597 37 8557 38 735 38 9891 39 842
+ 39 7513 39 9721 40 3475 41 115 41 4874 41 5906 42 4185
+ 43 2754 43 3518 44 7072 44 9765 46 1041 46 1316 47 2198
+ 47 3378 47 7612 47 7923 49 6482 50 9450 51 5778 52 9370
+ 53 4408 54 1448 55 3174 55 6876 56 2913 56 3435 56 3574
+ 57 7223 58 5248 58 7876 58 9318 58 9823 59 697 59 2813
+ 59 6665 59 7455 60 6821 61 2426 61 4944 62 904 62 8658
+ 63 4471 64 8407 65 2116 65 5177 65 5603 66 8142 67 1620
+ 68 803 69 9260 70 7396 72 4833 72 8004 72 8076 73 5017
+ 73 5716 73 6213 74 74 74 189 74 2365 74 5538 74 7297 75 3665
+ 75 6951 75 8343 76 3964 77 1903 77 7028 78 1394 78 4293
+ 79 6292 80 4677 80 7692 81 542 81 4045 81 8488 82 10117
+ 83 10008 84 1826 84 4761 84 9534 84 9628 85 2602 85 2711
+ 85 7166 86 2291 87 4560 87 5865 88 6380 89 461 89 3306
+ 89 3790 90 3119 90 6606 90 7782 91 995 91 2517 91 3007
+ 91 8749 91 8876 93 1742 93 2051 93 8268 94 4143 95 5112
+ 95 6118 95 9191 96 638 96 5344 96 6761 97 1243 97 1545
+ 98 3888 98 5442 99 311 99 1146 99 9093}
do_execsql_test 4.8.3 {
SELECT b, sum(b) OVER (
ORDER BY a
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) FROM t2 ORDER BY 1, 2;
-} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141 98 10141 99 10141 99 10141 99 10141}
+} {0 10141 1 10141 1 10141 2 10141 2 10141 2 10141 3 10141
+ 3 10141 4 10141 5 10141 6 10141 7 10141 7 10141 7 10141
+ 8 10141 8 10141 8 10141 9 10141 9 10141 9 10141 10 10141
+ 11 10141 11 10141 12 10141 12 10141 12 10141 13 10141 13 10141
+ 14 10141 15 10141 15 10141 15 10141 16 10141 16 10141 16 10141
+ 17 10141 19 10141 20 10141 21 10141 21 10141 22 10141 22 10141
+ 23 10141 23 10141 23 10141 24 10141 25 10141 26 10141 26 10141
+ 26 10141 27 10141 27 10141 28 10141 29 10141 29 10141 29 10141
+ 30 10141 30 10141 30 10141 31 10141 31 10141 32 10141 33 10141
+ 33 10141 33 10141 33 10141 33 10141 34 10141 34 10141 34 10141
+ 34 10141 35 10141 35 10141 36 10141 36 10141 36 10141 36 10141
+ 37 10141 37 10141 38 10141 38 10141 39 10141 39 10141 39 10141
+ 40 10141 41 10141 41 10141 41 10141 42 10141 43 10141 43 10141
+ 44 10141 44 10141 46 10141 46 10141 47 10141 47 10141 47 10141
+ 47 10141 49 10141 50 10141 51 10141 52 10141 53 10141 54 10141
+ 55 10141 55 10141 56 10141 56 10141 56 10141 57 10141 58 10141
+ 58 10141 58 10141 58 10141 59 10141 59 10141 59 10141 59 10141
+ 60 10141 61 10141 61 10141 62 10141 62 10141 63 10141 64 10141
+ 65 10141 65 10141 65 10141 66 10141 67 10141 68 10141 69 10141
+ 70 10141 72 10141 72 10141 72 10141 73 10141 73 10141 73 10141
+ 74 10141 74 10141 74 10141 74 10141 74 10141 75 10141 75 10141
+ 75 10141 76 10141 77 10141 77 10141 78 10141 78 10141 79 10141
+ 80 10141 80 10141 81 10141 81 10141 81 10141 82 10141 83 10141
+ 84 10141 84 10141 84 10141 84 10141 85 10141 85 10141 85 10141
+ 86 10141 87 10141 87 10141 88 10141 89 10141 89 10141 89 10141
+ 90 10141 90 10141 90 10141 91 10141 91 10141 91 10141 91 10141
+ 91 10141 93 10141 93 10141 93 10141 94 10141 95 10141 95 10141
+ 95 10141 96 10141 96 10141 96 10141 97 10141 97 10141 98 10141
+ 98 10141 99 10141 99 10141 99 10141}
do_execsql_test 4.8.4 {
SELECT b, sum(b) OVER (
ORDER BY a
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) FROM t2 ORDER BY 1, 2;
-} {0 10141 1 4699 1 6763 2 3069 2 5670 2 9771 3 1048 3 7228 4 6096 5 4503 6 9100 7 7 7 3067 7 7943 8 3727 8 4223 8 8596 9 1653 9 2218 9 5267 10 607 11 3719 11 4425 12 1571 12 4235 12 7328 13 1584 13 4964 14 1559 15 1232 15 4133 15 6967 16 6567 16 8199 16 8215 17 24 19 2686 20 4215 21 480 21 4698 22 4023 22 7134 23 1644 23 8238 23 9952 24 7539 25 6835 26 2602 26 2628 26 9830 27 133 27 8898 28 6952 29 2844 29 5815 29 8521 30 318 30 771 30 5956 31 4164 31 4195 32 7316 33 513 33 1265 33 1999 33 5848 33 9804 34 250 34 1217 34 3659 34 3761 35 4538 35 8025 36 1183 36 1392 36 2359 36 6476 37 1621 37 5581 38 288 38 9444 39 459 39 2667 39 9338 40 6706 41 4276 41 5308 41 10067 42 5998 43 6666 43 7430 44 420 44 3113 46 8871 46 9146 47 2265 47 2576 47 6810 47 7990 49 3708 50 741 51 4414 52 823 53 5786 54 8747 55 3320 55 7022 56 6623 56 6762 56 7284 57 2975 58 376 58 881 58 2323 58 4951 59 2745 59 3535 59 7387 59 9503 60 3380 61 5258 61 7776 62 1545 62 9299 63 5733 64 1798 65 4603 65 5029 65 8090 66 2065 67 8588 68 9406 69 950 70 2815 72 2137 72 2209 72 5380 73 4001 73 4498 73 5197 74 2918 74 4677 74 7850 74 10026 74 10141 75 1873 75 3265 75 6551 76 6253 77 3190 77 8315 78 5926 78 8825 79 3928 80 2529 80 5544 81 1734 81 6177 81 9680 82 106 83 216 84 597 84 691 84 5464 84 8399 85 3060 85 7515 85 7624 86 7936 87 4363 87 5668 88 3849 89 6440 89 6924 89 9769 90 2449 90 3625 90 7112 91 1356 91 1483 91 7225 91 7715 91 9237 93 1966 93 8183 93 8492 94 6092 95 1045 95 4118 95 5124 96 3476 96 4893 96 9599 97 8693 97 8995 98 4797 98 6351 99 1147 99 9094 99 9929}
+} {0 10141 1 4699 1 6763 2 3069 2 5670 2 9771 3 1048 3 7228
+ 4 6096 5 4503 6 9100 7 7 7 3067 7 7943 8 3727 8 4223 8 8596
+ 9 1653 9 2218 9 5267 10 607 11 3719 11 4425 12 1571 12 4235
+ 12 7328 13 1584 13 4964 14 1559 15 1232 15 4133 15 6967
+ 16 6567 16 8199 16 8215 17 24 19 2686 20 4215 21 480 21 4698
+ 22 4023 22 7134 23 1644 23 8238 23 9952 24 7539 25 6835
+ 26 2602 26 2628 26 9830 27 133 27 8898 28 6952 29 2844
+ 29 5815 29 8521 30 318 30 771 30 5956 31 4164 31 4195 32 7316
+ 33 513 33 1265 33 1999 33 5848 33 9804 34 250 34 1217 34 3659
+ 34 3761 35 4538 35 8025 36 1183 36 1392 36 2359 36 6476
+ 37 1621 37 5581 38 288 38 9444 39 459 39 2667 39 9338 40 6706
+ 41 4276 41 5308 41 10067 42 5998 43 6666 43 7430 44 420
+ 44 3113 46 8871 46 9146 47 2265 47 2576 47 6810 47 7990
+ 49 3708 50 741 51 4414 52 823 53 5786 54 8747 55 3320 55 7022
+ 56 6623 56 6762 56 7284 57 2975 58 376 58 881 58 2323 58 4951
+ 59 2745 59 3535 59 7387 59 9503 60 3380 61 5258 61 7776
+ 62 1545 62 9299 63 5733 64 1798 65 4603 65 5029 65 8090
+ 66 2065 67 8588 68 9406 69 950 70 2815 72 2137 72 2209
+ 72 5380 73 4001 73 4498 73 5197 74 2918 74 4677 74 7850
+ 74 10026 74 10141 75 1873 75 3265 75 6551 76 6253 77 3190
+ 77 8315 78 5926 78 8825 79 3928 80 2529 80 5544 81 1734
+ 81 6177 81 9680 82 106 83 216 84 597 84 691 84 5464 84 8399
+ 85 3060 85 7515 85 7624 86 7936 87 4363 87 5668 88 3849
+ 89 6440 89 6924 89 9769 90 2449 90 3625 90 7112 91 1356
+ 91 1483 91 7225 91 7715 91 9237 93 1966 93 8183 93 8492
+ 94 6092 95 1045 95 4118 95 5124 96 3476 96 4893 96 9599
+ 97 8693 97 8995 98 4797 98 6351 99 1147 99 9094 99 9929}
+
+
+do_test 4.9 {
+ set myres {}
+ foreach r [db eval {SELECT
+ rank() OVER win AS rank,
+ cume_dist() OVER win AS cume_dist FROM t1
+ WINDOW win AS (ORDER BY 1);}] {
+ lappend myres [format %.4f [set r]]
+ }
+ set res2 {1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000}
+ set i 0
+ foreach r [set myres] r2 [set res2] {
+ if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} {
+ error "list element [set i] does not match: got=[set r] expected=[set r2]"
+ }
+ incr i
+ }
+ set {} {}
+} {}
+
+do_execsql_test 4.10 {
+ SELECT count(*) OVER (ORDER BY b) FROM t1
+} {3 3 3 6 6 6}
+
+do_execsql_test 4.11 {
+ SELECT count(distinct a) FILTER (WHERE b='odd') FROM t1
+} {3}
+
+#==========================================================================
+
+do_execsql_test 5.0 {
+ DROP TABLE IF EXISTS t1;
+ CREATE TABLE t1(x INTEGER, y INTEGER);
+ INSERT INTO t1 VALUES(10, 1);
+ INSERT INTO t1 VALUES(20, 2);
+ INSERT INTO t1 VALUES(3, 3);
+ INSERT INTO t1 VALUES(2, 4);
+ INSERT INTO t1 VALUES(1, 5);
+} {}
+
+
+do_test 5.1 {
+ set myres {}
+ foreach r [db eval {SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z;}] {
+ lappend myres [format %.4f [set r]]
+ }
+ set res2 {7.2000 8.7500 10.0000 11.0000 15.0000}
+ set i 0
+ foreach r [set myres] r2 [set res2] {
+ if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} {
+ error "list element [set i] does not match: got=[set r] expected=[set r2]"
+ }
+ incr i
+ }
+ set {} {}
+} {}
finish_test
Index: test/window4.tcl
==================================================================
--- test/window4.tcl
+++ test/window4.tcl
@@ -383,8 +383,28 @@
SELECT * FROM (
SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8
) sub;
}
+execsql_test 12.0 {
+ DROP TABLE IF EXISTS t2;
+ CREATE TABLE t2(a INTEGER);
+ INSERT INTO t2 VALUES(1), (2), (3);
+}
+
+execsql_test 12.1 {
+ SELECT (SELECT min(a) OVER ()) FROM t2
+}
+
+execsql_float_test 12.2 {
+ SELECT (SELECT avg(a)) FROM t2 ORDER BY 1
+}
+
+execsql_float_test 12.3 {
+ SELECT
+ (SELECT avg(a) UNION SELECT min(a) OVER ())
+ FROM t2 GROUP BY a
+ ORDER BY 1
+}
finish_test
Index: test/window4.test
==================================================================
--- test/window4.test
+++ test/window4.test
@@ -1321,7 +1321,54 @@
do_execsql_test 11.4 {
SELECT * FROM (
SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8
) sub;
} {0 1 2}
+
+do_execsql_test 12.0 {
+ DROP TABLE IF EXISTS t2;
+ CREATE TABLE t2(a INTEGER);
+ INSERT INTO t2 VALUES(1), (2), (3);
+} {}
+
+do_execsql_test 12.1 {
+ SELECT (SELECT min(a) OVER ()) FROM t2
+} {1 2 3}
+
+
+do_test 12.2 {
+ set myres {}
+ foreach r [db eval {SELECT (SELECT avg(a)) FROM t2 ORDER BY 1}] {
+ lappend myres [format %.4f [set r]]
+ }
+ set res2 {2.0000}
+ set i 0
+ foreach r [set myres] r2 [set res2] {
+ if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} {
+ error "list element [set i] does not match: got=[set r] expected=[set r2]"
+ }
+ incr i
+ }
+ set {} {}
+} {}
+
+
+do_test 12.3 {
+ set myres {}
+ foreach r [db eval {SELECT
+ (SELECT avg(a) UNION SELECT min(a) OVER ())
+ FROM t2 GROUP BY a
+ ORDER BY 1}] {
+ lappend myres [format %.4f [set r]]
+ }
+ set res2 {1.0000 2.0000 3.0000}
+ set i 0
+ foreach r [set myres] r2 [set res2] {
+ if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} {
+ error "list element [set i] does not match: got=[set r] expected=[set r2]"
+ }
+ incr i
+ }
+ set {} {}
+} {}
finish_test
Index: test/window6.test
==================================================================
--- test/window6.test
+++ test/window6.test
@@ -366,6 +366,5 @@
ten fifteen.ten
thirty fifteen.ten.thirty
}
finish_test
-
Index: test/window7.test
==================================================================
--- test/window7.test
+++ test/window7.test
@@ -39,56 +39,148 @@
(7, 97), (8, 98), (9, 99), (0, 100);
} {}
do_execsql_test 1.1 {
SELECT a, sum(b) FROM t3 GROUP BY a ORDER BY 1;
-} {0 550 1 460 2 470 3 480 4 490 5 500 6 510 7 520 8 530 9 540}
+} {0 550 1 460 2 470 3 480 4 490 5 500 6 510 7 520 8 530
+ 9 540}
do_execsql_test 1.2 {
SELECT a, sum(b) OVER (
ORDER BY a GROUPS BETWEEN CURRENT ROW AND CURRENT ROW
) FROM t3 ORDER BY 1;
-} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540}
+} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550
+ 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460
+ 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470
+ 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480
+ 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490
+ 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500
+ 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510
+ 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520
+ 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530
+ 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530
+ 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540
+ 9 540}
do_execsql_test 1.3 {
SELECT a, sum(b) OVER (
ORDER BY a GROUPS BETWEEN 0 PRECEDING AND 0 FOLLOWING
) FROM t3 ORDER BY 1;
-} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540}
+} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550
+ 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460
+ 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470
+ 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480
+ 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490
+ 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500
+ 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510
+ 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520
+ 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530
+ 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530
+ 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540
+ 9 540}
do_execsql_test 1.4 {
SELECT a, sum(b) OVER (
ORDER BY a GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING
) FROM t3 ORDER BY 1;
-} {0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590}
+} {0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480
+ 0 1480 0 1480 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960
+ 1 1960 1 1960 1 1960 1 1960 2 2450 2 2450 2 2450 2 2450
+ 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 3 2400 3 2400
+ 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400
+ 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450
+ 4 2450 4 2450 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500
+ 5 2500 5 2500 5 2500 5 2500 6 2550 6 2550 6 2550 6 2550
+ 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 7 2600 7 2600
+ 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600
+ 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100
+ 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590
+ 9 1590 9 1590 9 1590 9 1590}
do_execsql_test 1.5 {
SELECT a, sum(b) OVER (
ORDER BY a RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING
) FROM t3 ORDER BY 1;
-} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540}
+} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550
+ 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460
+ 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470
+ 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480
+ 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490
+ 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500
+ 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510
+ 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520
+ 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530
+ 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530
+ 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540
+ 9 540}
do_execsql_test 1.6 {
SELECT a, sum(b) OVER (
ORDER BY a RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING
) FROM t3 ORDER BY 1;
-} {0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590}
+} {0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480
+ 0 1480 0 1480 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960
+ 1 1960 1 1960 1 1960 1 1960 2 2450 2 2450 2 2450 2 2450
+ 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 3 2400 3 2400
+ 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400
+ 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450
+ 4 2450 4 2450 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500
+ 5 2500 5 2500 5 2500 5 2500 6 2550 6 2550 6 2550 6 2550
+ 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 7 2600 7 2600
+ 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600
+ 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100
+ 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590
+ 9 1590 9 1590 9 1590 9 1590}
do_execsql_test 1.7 {
SELECT a, sum(b) OVER (
ORDER BY a RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING
) FROM t3 ORDER BY 1;
-} {0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590}
+} {0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010
+ 0 1010 0 1010 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480
+ 1 1480 1 1480 1 1480 1 1480 2 1960 2 1960 2 1960 2 1960
+ 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 3 1900 3 1900
+ 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900
+ 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940
+ 4 1940 4 1940 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980
+ 5 1980 5 1980 5 1980 5 1980 6 2020 6 2020 6 2020 6 2020
+ 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 7 2060 7 2060
+ 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060
+ 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100
+ 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590
+ 9 1590 9 1590 9 1590 9 1590}
do_execsql_test 1.8.1 {
SELECT a, sum(b) OVER (
ORDER BY a RANGE BETWEEN 0 PRECEDING AND 1 FOLLOWING
) FROM t3 ORDER BY 1;
-} {0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 1 930 1 930 1 930 1 930 1 930 1 930 1 930 1 930 1 930 1 930 2 950 2 950 2 950 2 950 2 950 2 950 2 950 2 950 2 950 2 950 3 970 3 970 3 970 3 970 3 970 3 970 3 970 3 970 3 970 3 970 4 990 4 990 4 990 4 990 4 990 4 990 4 990 4 990 4 990 4 990 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540}
+} {0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010
+ 0 1010 0 1010 1 930 1 930 1 930 1 930 1 930 1 930 1 930
+ 1 930 1 930 1 930 2 950 2 950 2 950 2 950 2 950 2 950
+ 2 950 2 950 2 950 2 950 3 970 3 970 3 970 3 970 3 970
+ 3 970 3 970 3 970 3 970 3 970 4 990 4 990 4 990 4 990
+ 4 990 4 990 4 990 4 990 4 990 4 990 5 1010 5 1010 5 1010
+ 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 6 1030
+ 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030
+ 6 1030 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050
+ 7 1050 7 1050 7 1050 8 1070 8 1070 8 1070 8 1070 8 1070
+ 8 1070 8 1070 8 1070 8 1070 8 1070 9 540 9 540 9 540 9 540
+ 9 540 9 540 9 540 9 540 9 540 9 540}
do_execsql_test 1.8.2 {
SELECT a, sum(b) OVER (
ORDER BY a DESC RANGE BETWEEN 0 PRECEDING AND 1 FOLLOWING
) FROM t3 ORDER BY 1;
-} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 2 930 2 930 2 930 2 930 2 930 2 930 2 930 2 930 2 930 2 930 3 950 3 950 3 950 3 950 3 950 3 950 3 950 3 950 3 950 3 950 4 970 4 970 4 970 4 970 4 970 4 970 4 970 4 970 4 970 4 970 5 990 5 990 5 990 5 990 5 990 5 990 5 990 5 990 5 990 5 990 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070}
+} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550
+ 0 550 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010
+ 1 1010 1 1010 1 1010 2 930 2 930 2 930 2 930 2 930 2 930
+ 2 930 2 930 2 930 2 930 3 950 3 950 3 950 3 950 3 950
+ 3 950 3 950 3 950 3 950 3 950 4 970 4 970 4 970 4 970
+ 4 970 4 970 4 970 4 970 4 970 4 970 5 990 5 990 5 990
+ 5 990 5 990 5 990 5 990 5 990 5 990 5 990 6 1010 6 1010
+ 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010
+ 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030
+ 7 1030 7 1030 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050
+ 8 1050 8 1050 8 1050 8 1050 9 1070 9 1070 9 1070 9 1070
+ 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070}
finish_test
Index: test/window8.tcl
==================================================================
--- test/window8.tcl
+++ test/window8.tcl
@@ -195,34 +195,71 @@
execsql_test 4.2.1 {
SELECT sum(b) OVER (
ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
) FROM t1 ORDER BY 1 NULLS FIRST;
}
-
execsql_test 4.2.2 {
+ SELECT sum(b) OVER (
+ ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+}
+
+execsql_test 4.2.3 {
SELECT sum(b) OVER (
ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
) FROM t1 ORDER BY 1 NULLS FIRST;
}
+execsql_test 4.2.4 {
+ SELECT sum(b) OVER (
+ ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+}
execsql_test 4.3.1 {
SELECT sum(b) OVER (
ORDER BY a NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
) FROM t1 ORDER BY 1 NULLS FIRST;
}
+execsql_test 4.3.2 {
+ SELECT sum(b) OVER (
+ ORDER BY a NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+}
execsql_test 4.4.1 {
SELECT sum(b) OVER (
ORDER BY a NULLS FIRST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) FROM t1 ORDER BY 1 NULLS FIRST;
}
-
execsql_test 4.4.2 {
+ SELECT sum(b) OVER (
+ ORDER BY a NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+}
+
+execsql_test 4.4.3 {
SELECT sum(b) OVER (
ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) FROM t1 ORDER BY 1 NULLS FIRST;
}
+execsql_test 4.4.4 {
+ SELECT sum(b) OVER (
+ ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+}
+
+execsql_test 4.5.1 {
+ SELECT sum(b) OVER (
+ ORDER BY a ASC NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+}
+execsql_test 4.5.2 {
+ SELECT sum(b) OVER (
+ ORDER BY a DESC NULLS FIRST RANGE
+ BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+}
==========
execsql_test 5.0 {
INSERT INTO t3 VALUES
@@ -246,10 +283,21 @@
4 { ORDER BY a NULLS FIRST GROUPS 6 PRECEDING }
5 { ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING }
6 { ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING }
7 { ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING }
+
+ 8 { RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
+ 9 { ORDER BY a NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
+ 10 { PARTITION BY coalesce(a, '')
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
+ 11 { ORDER BY a NULLS LAST GROUPS 6 PRECEDING }
+ 12 { ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING }
+ 13 { ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING }
+ 14 { ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
+ ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING }
} {
execsql_test 5.$tn.$tn2.1 "
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
@@ -290,10 +338,88 @@
SELECT string_agg(a, '.') OVER (
ORDER BY b DESC NULLS LAST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
)
FROM t2
}
+
+==========
+
+execsql_test 7.0 {
+ DROP TABLE IF EXISTS t2;
+ CREATE TABLE t2(a INTEGER, b INTEGER);
+
+ INSERT INTO t2 VALUES(1, 65);
+ INSERT INTO t2 VALUES(2, NULL);
+ INSERT INTO t2 VALUES(3, NULL);
+ INSERT INTO t2 VALUES(4, NULL);
+ INSERT INTO t2 VALUES(5, 66);
+ INSERT INTO t2 VALUES(6, 67);
+}
+
+foreach {tn f ex} {
+ 1 sum ""
+ 2 min ""
+ 3 sum "EXCLUDE CURRENT ROW"
+ 4 max "EXCLUDE CURRENT ROW"
+} {
+execsql_test 7.$tn.1 "
+ SELECT $f (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
+ );
+"
+execsql_test 7.$tn.2 "
+ SELECT $f (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+"
+execsql_test 7.$tn.3 "
+ SELECT $f (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+"
+execsql_test 7.$tn.4 "
+ SELECT $f (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+"
+execsql_test 7.$tn.5 "
+ SELECT $f (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+"
+
+execsql_test 7.$tn.6 "
+ SELECT $f (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
+ );
+"
+execsql_test 7.$tn.7 "
+ SELECT $f (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+"
+execsql_test 7.$tn.8 "
+ SELECT $f (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
+ );
+"
+execsql_test 7.$tn.9 "
+ SELECT $f (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+"
+}
+
finish_test
Index: test/window8.test
==================================================================
--- test/window8.test
+++ test/window8.test
@@ -3520,36 +3520,79 @@
} {6 6 6 9 9}
do_execsql_test 4.2.1 {
SELECT sum(b) OVER (
ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
- ) FROM t1 ORDER BY 1 ;
+ ) FROM t1 ORDER BY 1 NULLS FIRST;
} {{} {} 6 6 6}
do_execsql_test 4.2.2 {
+ SELECT sum(b) OVER (
+ ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+} {6 6 6 {} {}}
+
+do_execsql_test 4.2.3 {
SELECT sum(b) OVER (
ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
- ) FROM t1 ORDER BY 1 ;
+ ) FROM t1 ORDER BY 1 NULLS FIRST;
} {{} {} 6 6 6}
+do_execsql_test 4.2.4 {
+ SELECT sum(b) OVER (
+ ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+} {6 6 6 {} {}}
+
do_execsql_test 4.3.1 {
SELECT sum(b) OVER (
- ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
- ) FROM t1 ORDER BY 1 ;
+ ORDER BY a NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS FIRST;
} {6 6 6 15 15}
+do_execsql_test 4.3.2 {
+ SELECT sum(b) OVER (
+ ORDER BY a NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+} {9 9 15 15 15}
+
do_execsql_test 4.4.1 {
SELECT sum(b) OVER (
- ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
- ) FROM t1 ORDER BY 1 ;
+ ORDER BY a NULLS FIRST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS FIRST;
} {3 6 9 9 12}
do_execsql_test 4.4.2 {
SELECT sum(b) OVER (
- ORDER BY a DESC ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
- ) FROM t1 ORDER BY 1 ;
+ ORDER BY a NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+} {5 6 8 9 10}
+
+do_execsql_test 4.4.3 {
+ SELECT sum(b) OVER (
+ ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS FIRST;
+} {5 6 8 9 10}
+
+do_execsql_test 4.4.4 {
+ SELECT sum(b) OVER (
+ ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
} {5 6 8 9 10}
+
+do_execsql_test 4.5.1 {
+ SELECT sum(b) OVER (
+ ORDER BY a ASC NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+} {9 9 15 15 15}
+
+do_execsql_test 4.5.2 {
+ SELECT sum(b) OVER (
+ ORDER BY a DESC NULLS FIRST RANGE
+ BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
+ ) FROM t1 ORDER BY 1 NULLS LAST;
+} {6 6 6 15 15}
#==========================================================================
do_execsql_test 5.0 {
INSERT INTO t3 VALUES
@@ -3562,11 +3605,11 @@
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
@@ -3585,11 +3628,11 @@
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
@@ -3607,13 +3650,13 @@
do_execsql_test 5.1.2.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY a
+ WINDOW win AS ( ORDER BY a NULLS FIRST
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9
899 113 9 899 113 9 899 113 9 899 113 16 899 113 16 899 113 16
899 113 16 899 113 16 899 113 16 899 113 16 979 102 44 979 102 44
979 102 44 979 102 44 979 102 44 979 102 44 979 102 44 979 102 44
979 102 44 979 102 44 979 102 44 979 102 49 979 102 49 979 102 49
@@ -3631,13 +3674,13 @@
do_execsql_test 5.1.2.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY a
+ WINDOW win AS ( ORDER BY a NULLS FIRST
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {2947 81 11 2947 81 11 2947 81 11 2947 81 11 2947 81 11 2947 81 11
2947 81 11 2947 81 11 2947 81 11 5287 74 10 5287 74 10 5287 74 10
5287 74 10 5287 74 10 5287 74 10 5287 74 10 8400 65 9 8400 65 9
8400 65 9 8400 65 9 8400 65 9 8400 65 9 8400 65 9 8400 65 9
8400 65 9 9664 57 8 9664 57 8 9664 57 8 9664 57 8 9664 57 8
@@ -3657,11 +3700,11 @@
min(c) OVER win,
count(a) OVER win
FROM t3
WINDOW win AS ( PARTITION BY coalesce(a, '')
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {777 113 5 777 113 5 777 113 5 777 113 5 777 113 5 805 250 7
805 250 7 805 250 7 805 250 7 805 250 7 805 250 7 805 250 7
822 158 6 822 158 6 822 158 6 822 158 6 822 158 6 822 158 6
840 247 13 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13
840 247 13 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13
@@ -3681,11 +3724,11 @@
rank() OVER win,
dense_rank() OVER win
FROM t3
WINDOW win AS ( PARTITION BY coalesce(a, '')
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1
962 1 1 962 1 1 962 1 1 962 1 1 1264 1 1 1264 1 1 1264 1 1
1264 1 1 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1366 1 1 1366 1 1
1366 1 1 1366 1 1 1366 1 1 1366 1 1 1519 1 1 1519 1 1 1519 1 1
1519 1 1 1519 1 1 1804 1 1 1804 1 1 1804 1 1 1804 1 1 1804 1 1
@@ -3701,12 +3744,12 @@
do_execsql_test 5.1.4.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0
934 158 8 934 158 8 934 158 8 934 158 8 934 158 8 934 158 8
934 158 8 934 158 8 934 158 21 934 158 21 934 158 21 934 158 21
934 158 21 934 158 21 934 158 21 934 158 21 934 158 21 934 158 21
934 158 21 934 158 21 934 158 21 934 158 27 934 158 27 934 158 27
@@ -3724,12 +3767,12 @@
do_execsql_test 5.1.4.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {2050 1 1 2050 1 1 2050 1 1 2050 1 1 2050 1 1 2050 1 1 4359 7 2
4359 7 2 4359 7 2 4359 7 2 4359 7 2 4359 7 2 4359 7 2 4359 7 2
7840 15 3 7840 15 3 7840 15 3 7840 15 3 7840 15 3 7840 15 3
7840 15 3 7840 15 3 7840 15 3 7840 15 3 7840 15 3 7840 15 3
7840 15 3 9206 28 4 9206 28 4 9206 28 4 9206 28 4 9206 28 4
@@ -3748,12 +3791,12 @@
do_execsql_test 5.1.5.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {102 102 1 113 113 2 113 113 2 133 133 1 148 148 1 160 158 2
160 158 2 160 158 2 208 208 1 224 223 2 224 223 2 239 234 3
239 234 3 239 234 3 252 247 3 257 247 5 257 247 5 257 250 4
257 252 3 295 295 1 309 309 1 336 330 3 336 330 3 336 330 3
346 346 1 355 354 2 355 354 2 355 354 2 399 393 4 399 393 4
@@ -3771,12 +3814,12 @@
do_execsql_test 5.1.5.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 25 23 {} 34 29
{} 36 31 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 43 37 {} 43 37
{} 50 42 {} 60 51 {} 61 52 {} 64 55 {} 64 55 {} 67 57 {} 68 58
{} 69 59 {} 70 60 {} 72 62 {} 78 67 {} 78 67 {} 78 67 {} 85 72
{} 85 72 133 4 3 223 10 8 223 11 9 226 2 2 226 2 2 239 12 10
@@ -3793,12 +3836,12 @@
do_execsql_test 5.1.6.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {102 102 1 113 113 2 113 113 2 133 133 1 148 148 1 158 158 1
158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1
238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1
257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1
346 346 1 354 354 1 355 355 1 355 355 1 393 393 2 393 393 2
@@ -3816,12 +3859,12 @@
do_execsql_test 5.1.6.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 11 9 {} 12 10
{} 13 11 {} 16 14 {} 17 15 {} 18 16 {} 22 20 {} 24 22 {} 25 23
{} 26 24 {} 31 27 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34
{} 41 35 {} 43 37 {} 43 37 {} 49 41 {} 50 42 {} 51 43 {} 54 45
{} 59 50 {} 60 51 {} 61 52 {} 63 54 {} 64 55 {} 64 55 {} 67 57
@@ -3838,13 +3881,13 @@
do_execsql_test 5.1.7.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c , b , a
+ WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
979 102 83 979 113 81 979 113 82 979 133 80 979 148 79 979 158 77
979 158 78 979 160 77 979 208 76 979 223 75 979 224 74 979 234 73
979 238 72 979 239 71 979 247 70 979 250 69 979 252 68 979 256 67
979 257 66 979 295 65 979 309 64 979 330 63 979 335 62 979 336 61
@@ -3862,13 +3905,339 @@
do_execsql_test 5.1.7.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c , b , a
+ WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
+ ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87
+ 6485 81 81 6485 82 82 6485 83 83 7324 80 80 8163 78 78 8163 79 79
+ 8968 73 73 8968 74 74 8968 75 75 8968 76 76 8968 77 77 9745 69 69
+ 9745 70 70 9745 71 71 9745 72 72 10504 65 65 10504 66 66
+ 10504 67 67 10504 68 68 11215 64 64 11920 63 63 12603 62 62
+ 13274 60 60 13274 61 61 13941 59 59 14608 55 55 14608 56 56
+ 14608 57 57 14608 58 58 15241 54 54 15870 53 53 16499 52 52
+ 17126 49 49 17126 50 50 17126 51 51 17733 44 44 17733 45 45
+ 17733 46 46 17733 47 47 17733 48 48 18176 42 42 18176 43 43
+ 18597 40 40 18597 41 41 18996 39 39 19395 37 37 19395 38 38
+ 19788 36 36 20181 35 35 20536 34 34 20891 30 30 20891 31 31
+ 20891 32 32 20891 33 33 21226 28 28 21226 29 29 21535 27 27
+ 21830 26 26 22087 22 22 22087 23 23 22087 24 24 22087 25 25
+ 22334 21 21 22573 17 17 22573 18 18 22573 19 19 22573 20 20
+ 22796 11 11 22796 12 12 22796 13 13 22796 14 14 22796 15 15
+ 22796 16 16 22929 10 10 23042 9 9 23155 1 1 23155 2 2 23155 3 3
+ 23155 4 4 23155 5 5 23155 6 6 23155 7 7 23155 8 8}
+
+do_execsql_test 5.1.8.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83}
+
+do_execsql_test 5.1.8.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1}
+
+do_execsql_test 5.1.9.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0
+ 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9
+ 899 113 9 899 113 9 899 113 9 899 113 16 899 113 16 899 113 16
+ 899 113 16 899 113 16 899 113 16 899 113 16 979 102 44 979 102 44
+ 979 102 44 979 102 44 979 102 44 979 102 44 979 102 44 979 102 44
+ 979 102 44 979 102 44 979 102 44 979 102 49 979 102 49 979 102 49
+ 979 102 49 979 102 49 979 102 56 979 102 56 979 102 56 979 102 56
+ 979 102 56 979 102 56 979 102 56 979 102 62 979 102 62 979 102 62
+ 979 102 62 979 102 62 979 102 62 979 102 75 979 102 75 979 102 75
+ 979 102 75 979 102 75 979 102 75 979 102 75 979 102 75 979 102 75
+ 979 102 75 979 102 75 979 102 75 979 102 75 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 113 25 979 113 25 979 113 25 979 113 25 979 113 25 979 113 25
+ 979 113 25 979 113 25 979 113 25 979 113 33 979 113 33 979 113 33
+ 979 113 33 979 113 33 979 113 33 979 113 33 979 113 33}
+
+do_execsql_test 5.1.9.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {2050 84 11 2050 84 11 2050 84 11 2050 84 11 2050 84 11 2050 84 11
+ 4997 75 10 4997 75 10 4997 75 10 4997 75 10 4997 75 10 4997 75 10
+ 4997 75 10 4997 75 10 4997 75 10 7337 68 9 7337 68 9 7337 68 9
+ 7337 68 9 7337 68 9 7337 68 9 7337 68 9 10450 59 8 10450 59 8
+ 10450 59 8 10450 59 8 10450 59 8 10450 59 8 10450 59 8 10450 59 8
+ 10450 59 8 11714 51 7 11714 51 7 11714 51 7 11714 51 7 11714 51 7
+ 11714 51 7 11714 51 7 11714 51 7 12676 40 6 12676 40 6 12676 40 6
+ 12676 40 6 12676 40 6 12676 40 6 12676 40 6 12676 40 6 12676 40 6
+ 12676 40 6 12676 40 6 14195 35 5 14195 35 5 14195 35 5 14195 35 5
+ 14195 35 5 15999 28 4 15999 28 4 15999 28 4 15999 28 4 15999 28 4
+ 15999 28 4 15999 28 4 17365 22 3 17365 22 3 17365 22 3 17365 22 3
+ 17365 22 3 17365 22 3 20846 9 2 20846 9 2 20846 9 2 20846 9 2
+ 20846 9 2 20846 9 2 20846 9 2 20846 9 2 20846 9 2 20846 9 2
+ 20846 9 2 20846 9 2 20846 9 2 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1}
+
+do_execsql_test 5.1.10.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( PARTITION BY coalesce(a, '')
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {777 113 5 777 113 5 777 113 5 777 113 5 777 113 5 805 250 7
+ 805 250 7 805 250 7 805 250 7 805 250 7 805 250 7 805 250 7
+ 822 158 6 822 158 6 822 158 6 822 158 6 822 158 6 822 158 6
+ 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13
+ 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13
+ 840 247 13 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0
+ 870 158 0 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9
+ 899 113 9 899 113 9 899 113 9 899 113 9 934 223 8 934 223 8
+ 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8
+ 938 102 11 938 102 11 938 102 11 938 102 11 938 102 11 938 102 11
+ 938 102 11 938 102 11 938 102 11 938 102 11 938 102 11 938 148 8
+ 938 148 8 938 148 8 938 148 8 938 148 8 938 148 8 938 148 8
+ 938 148 8 959 224 7 959 224 7 959 224 7 959 224 7 959 224 7
+ 959 224 7 959 224 7 979 133 9 979 133 9 979 133 9 979 133 9
+ 979 133 9 979 133 9 979 133 9 979 133 9 979 133 9}
+
+do_execsql_test 5.1.10.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( PARTITION BY coalesce(a, '')
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1
+ 962 1 1 962 1 1 962 1 1 962 1 1 1264 1 1 1264 1 1 1264 1 1
+ 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1366 1 1 1366 1 1
+ 1366 1 1 1366 1 1 1366 1 1 1366 1 1 1519 1 1 1519 1 1 1519 1 1
+ 1519 1 1 1519 1 1 1804 1 1 1804 1 1 1804 1 1 1804 1 1 1804 1 1
+ 1804 1 1 1804 1 1 2050 1 1 2050 1 1 2050 1 1 2050 1 1 2050 1 1
+ 2050 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1
+ 2309 1 1 2309 1 1 2340 1 1 2340 1 1 2340 1 1 2340 1 1 2340 1 1
+ 2340 1 1 2340 1 1 2947 1 1 2947 1 1 2947 1 1 2947 1 1 2947 1 1
+ 2947 1 1 2947 1 1 2947 1 1 2947 1 1 3113 1 1 3113 1 1 3113 1 1
+ 3113 1 1 3113 1 1 3113 1 1 3113 1 1 3113 1 1 3113 1 1 3481 1 1
+ 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1
+ 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1}
+
+do_execsql_test 5.1.11.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {934 158 27 934 158 27 934 158 27 934 158 27 934 158 27 934 158 27
+ 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8
+ 934 223 8 934 223 8 934 223 21 934 223 21 934 223 21 934 223 21
+ 934 223 21 934 223 21 934 223 21 934 223 21 934 223 21 934 223 21
+ 934 223 21 934 223 21 934 223 21 959 102 50 959 102 50 959 102 50
+ 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50
+ 959 102 50 959 102 50 959 102 58 959 102 58 959 102 58 959 102 58
+ 959 102 58 959 102 58 959 102 58 959 102 58 959 113 39 959 113 39
+ 959 113 39 959 113 39 959 113 39 959 158 34 959 158 34 959 158 34
+ 959 158 34 959 158 34 959 158 34 959 158 34 979 102 49 979 102 49
+ 979 102 49 979 102 49 979 102 49 979 102 49 979 102 53 979 102 53
+ 979 102 53 979 102 53 979 102 53 979 102 53 979 102 53 979 102 56
+ 979 102 56 979 102 56 979 102 56 979 102 56 979 102 56 979 102 56
+ 979 102 56 979 102 56 979 102 59 979 102 59 979 102 59 979 102 59
+ 979 102 59 979 102 59 979 102 59 979 102 59 979 102 59}
+
+do_execsql_test 5.1.11.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1
+ 2309 1 1 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2
+ 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2
+ 7156 22 3 7156 22 3 7156 22 3 7156 22 3 7156 22 3 7156 22 3
+ 8960 28 4 8960 28 4 8960 28 4 8960 28 4 8960 28 4 8960 28 4
+ 8960 28 4 10479 35 5 10479 35 5 10479 35 5 10479 35 5 10479 35 5
+ 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6
+ 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6 12368 68 9
+ 12368 68 9 12368 68 9 12368 68 9 12368 68 9 12368 68 9 12368 68 9
+ 12705 51 7 12705 51 7 12705 51 7 12705 51 7 12705 51 7 12705 51 7
+ 12705 51 7 12705 51 7 13509 59 8 13509 59 8 13509 59 8 13509 59 8
+ 13509 59 8 13509 59 8 13509 59 8 13509 59 8 13509 59 8
+ 13949 75 10 13949 75 10 13949 75 10 13949 75 10 13949 75 10
+ 13949 75 10 13949 75 10 13949 75 10 13949 75 10 14195 84 11
+ 14195 84 11 14195 84 11 14195 84 11 14195 84 11 14195 84 11}
+
+do_execsql_test 5.1.12.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {102 102 1 113 113 2 113 113 2 133 133 1 148 148 1 160 158 2
+ 160 158 2 160 158 2 208 208 1 224 223 2 224 223 2 239 234 3
+ 239 234 3 239 234 3 252 247 3 257 247 5 257 247 5 257 250 4
+ 257 252 3 295 295 1 309 309 1 336 330 3 336 330 3 336 330 3
+ 346 346 1 355 354 2 355 354 2 355 354 2 399 393 4 399 393 4
+ 399 393 4 399 393 4 399 393 4 412 412 1 421 421 1 430 430 1
+ 443 443 1 480 480 2 480 480 2 574 572 2 574 572 2 607 607 1
+ 618 618 2 618 618 2 634 627 4 634 627 4 634 627 4 634 627 4
+ 634 629 3 652 652 1 667 660 2 671 667 3 671 667 3 671 667 3
+ 671 667 3 683 683 1 711 705 2 716 705 3 716 711 2 730 726 2
+ 730 726 2 762 759 2 768 759 4 768 762 3 768 762 3 777 777 1
+ 792 786 3 794 786 4 794 786 4 794 790 3 805 805 1 822 822 1
+ 845 839 5 845 839 5 845 839 5 845 839 5 845 839 5 870 870 2
+ 870 870 2 870 870 2 899 899 1 911 911 1 934 929 2 938 929 4
+ 938 934 3 938 934 3 963 959 2 963 959 2 979 979 1}
+
+do_execsql_test 5.1.12.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 25 23 {} 34 29
+ {} 36 31 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 43 37 {} 43 37
+ {} 50 42 {} 60 51 {} 61 52 {} 64 55 {} 64 55 {} 67 57 {} 68 58
+ {} 69 59 {} 70 60 {} 72 62 {} 78 67 {} 78 67 {} 78 67 {} 85 72
+ {} 85 72 133 4 3 223 10 8 223 11 9 226 2 2 226 2 2 239 12 10
+ 239 13 11 239 14 12 247 15 13 257 18 16 257 19 17 295 20 18
+ 309 21 19 335 22 20 335 23 21 335 24 22 421 35 30 443 37 32
+ 504 16 14 504 17 15 607 42 36 683 56 47 710 26 24 710 27 25
+ 710 27 25 711 59 50 759 62 53 759 63 54 777 66 56 805 71 61
+ 899 81 68 911 82 69 929 83 70 929 84 71 979 89 75 1334 51 43
+ 1416 57 48 1416 58 49 1584 29 26 1584 29 26 1584 31 27 1584 32 28
+ 1584 32 28 1891 49 41 1922 87 73 1922 88 74 2005 52 44 2005 52 44
+ 2005 54 45 2005 55 46 2518 45 38 2518 46 39 2518 46 39 2518 48 40
+ 2523 73 63 2523 73 63 2523 75 64 2523 76 65 2523 77 66}
+
+do_execsql_test 5.1.13.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {102 102 1 113 113 2 113 113 2 133 133 1 148 148 1 158 158 1
+ 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1
+ 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1
+ 257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1
+ 346 346 1 354 354 1 355 355 1 355 355 1 393 393 2 393 393 2
+ 398 398 1 399 399 1 399 399 1 412 412 1 421 421 1 430 430 1
+ 443 443 1 480 480 2 480 480 2 572 572 1 574 574 1 607 607 1
+ 618 618 2 618 618 2 627 627 1 629 629 1 629 629 1 633 633 1
+ 634 634 1 652 652 1 660 660 1 667 667 1 667 667 1 670 670 1
+ 671 671 1 683 683 1 705 705 1 711 711 1 716 716 1 726 726 1
+ 730 730 1 759 759 1 762 762 1 768 768 2 768 768 2 777 777 1
+ 786 786 1 790 790 1 792 792 1 794 794 1 805 805 1 822 822 1
+ 839 839 2 839 839 2 840 840 1 844 844 1 845 845 1 870 870 2
+ 870 870 2 870 870 2 899 899 1 911 911 1 929 929 1 934 934 1
+ 938 938 2 938 938 2 959 959 1 963 963 1 979 979 1}
+
+do_execsql_test 5.1.13.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 11 9 {} 12 10
+ {} 13 11 {} 16 14 {} 17 15 {} 18 16 {} 22 20 {} 24 22 {} 25 23
+ {} 26 24 {} 31 27 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34
+ {} 41 35 {} 43 37 {} 43 37 {} 49 41 {} 50 42 {} 51 43 {} 54 45
+ {} 59 50 {} 60 51 {} 61 52 {} 63 54 {} 64 55 {} 64 55 {} 67 57
+ {} 68 58 {} 69 59 {} 70 60 {} 72 62 {} 75 64 {} 76 65 {} 78 67
+ {} 78 67 {} 78 67 {} 84 71 {} 85 72 {} 85 72 133 4 3 223 10 8
+ 226 2 2 226 2 2 239 14 12 247 15 13 257 19 17 295 20 18
+ 309 21 19 335 23 21 421 35 30 443 37 32 607 42 36 627 45 38
+ 633 48 40 671 55 46 683 56 47 705 57 48 710 27 25 710 27 25
+ 711 58 49 759 62 53 777 66 56 786 29 26 786 29 26 798 32 28
+ 798 32 28 805 71 61 845 77 66 899 81 68 911 82 69 929 83 70
+ 959 87 73 963 88 74 979 89 75 1258 46 39 1258 46 39 1334 52 44
+ 1334 52 44 1678 73 63 1678 73 63}
+
+do_execsql_test 5.1.14.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
+ ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 113 81 979 113 82 979 133 80 979 148 79 979 158 77
+ 979 158 78 979 160 77 979 208 76 979 223 75 979 224 74 979 234 73
+ 979 238 72 979 239 71 979 247 70 979 250 69 979 252 68 979 256 67
+ 979 257 66 979 295 65 979 309 64 979 330 63 979 335 62 979 336 61
+ 979 346 60 979 354 59 979 355 57 979 355 58 979 393 56 979 393 57
+ 979 398 55 979 399 53 979 399 54 979 412 53 979 421 52 979 430 51
+ 979 443 50 979 480 48 979 480 49 979 572 47 979 574 46 979 607 45
+ 979 618 43 979 618 44 979 627 42 979 629 40 979 629 41 979 633 40
+ 979 634 39 979 652 38 979 660 37 979 667 35 979 667 36 979 670 35
+ 979 671 34 979 683 33 979 705 32 979 711 31 979 716 30 979 726 29
+ 979 730 28 979 759 27 979 762 26 979 768 24 979 768 25 979 777 23
+ 979 786 22 979 790 21 979 792 20 979 794 19 979 805 18 979 822 17
+ 979 839 15 979 839 16 979 840 14 979 844 13 979 845 12 979 870 9
+ 979 870 10 979 870 11 979 899 9 979 911 8 979 929 7}
+
+do_execsql_test 5.1.14.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87
6485 81 81 6485 82 82 6485 83 83 7324 80 80 8163 78 78 8163 79 79
8968 73 73 8968 74 74 8968 75 75 8968 76 76 8968 77 77 9745 69 69
9745 70 70 9745 71 71 9745 72 72 10504 65 65 10504 66 66
10504 67 67 10504 68 68 11215 64 64 11920 63 63 12603 62 62
@@ -3889,11 +4258,11 @@
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {963 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
@@ -3912,11 +4281,11 @@
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {22176 1 1 22192 1 1 22196 1 1 22226 1 1 22244 1 1 22256 1 1
22310 1 1 22316 1 1 22316 1 1 22350 1 1 22378 1 1 22396 1 1
22444 1 1 22450 1 1 22472 1 1 22484 1 1 22488 1 1 22488 1 1
22522 1 1 22526 1 1 22526 1 1 22528 1 1 22548 1 1 22712 1 1
22734 1 1 22756 1 1 22756 1 1 22762 1 1 22762 1 1 22800 1 1
@@ -3934,13 +4303,13 @@
do_execsql_test 5.2.2.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY a
+ WINDOW win AS ( ORDER BY a NULLS FIRST
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {839 113 8 899 113 8 899 113 8 899 113 8 899 113 8 899 113 8
899 113 8 899 113 8 899 113 15 899 113 15 899 113 15 899 113 15
899 113 15 899 113 15 899 113 15 899 234 8 963 113 24 979 102 43
979 102 43 979 102 43 979 102 43 979 102 43 979 102 43 979 102 43
979 102 43 979 102 43 979 102 43 979 102 48 979 102 48 979 102 48
@@ -3958,13 +4327,13 @@
do_execsql_test 5.2.2.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY a
+ WINDOW win AS ( ORDER BY a NULLS FIRST
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {2048 81 11 2108 81 11 2108 81 11 2690 81 11 2834 81 11 2947 81 11
2947 81 11 2947 81 11 2947 81 11 4482 74 10 4616 74 10 4844 74 10
4866 74 10 5287 74 10 5287 74 10 5287 74 10 7421 65 9 7437 65 9
7717 65 9 8045 65 9 8267 65 9 8400 65 9 8400 65 9 8400 65 9
8400 65 9 8735 57 8 9329 57 8 9664 57 8 9664 57 8 9664 57 8
@@ -3984,11 +4353,11 @@
min(c) OVER win,
count(a) OVER win
FROM t3
WINDOW win AS ( PARTITION BY coalesce(a, '')
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {667 158 0 671 250 6 759 158 5 768 113 4 777 113 4 777 113 4
777 113 4 777 252 4 792 247 12 805 250 6 805 250 6 805 250 6
805 250 6 805 250 6 805 398 6 822 158 5 822 158 5 822 158 5
822 158 5 822 346 5 839 113 8 840 247 12 840 247 12 840 247 12
840 247 12 840 247 12 840 247 12 840 247 12 840 247 12 840 247 12
@@ -4008,11 +4377,11 @@
rank() OVER win,
dense_rank() OVER win
FROM t3
WINDOW win AS ( PARTITION BY coalesce(a, '')
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {295 1 1 335 1 1 607 1 1 667 1 1 742 1 1 759 1 1 845 1 1
890 1 1 929 1 1 959 1 1 962 1 1 962 1 1 962 1 1 962 1 1
962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 1264 1 1 1264 1 1
1264 1 1 1264 1 1 1264 1 1 1264 1 1 1366 1 1 1366 1 1 1366 1 1
1366 1 1 1383 1 1 1398 1 1 1406 1 1 1421 1 1 1519 1 1 1519 1 1
@@ -4028,12 +4397,12 @@
do_execsql_test 5.2.4.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {667 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 355 0
911 158 7 934 158 7 934 158 7 934 158 7 934 158 7 934 158 7
934 158 7 934 158 7 934 158 20 934 158 20 934 158 20 934 158 20
934 158 20 934 158 20 934 158 20 934 158 20 934 158 20 934 158 20
934 158 20 934 158 20 934 158 20 934 158 26 934 158 26 934 158 26
@@ -4051,12 +4420,12 @@
do_execsql_test 5.2.4.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {1383 1 1 1421 1 1 1651 1 1 1695 1 1 2050 1 1 2050 1 1 3448 7 2
3732 7 2 4050 7 2 4120 7 2 4136 7 2 4359 7 2 4359 7 2 4359 7 2
7129 15 3 7135 15 3 7207 15 3 7441 15 3 7447 15 3 7447 15 3
7593 15 3 7840 15 3 7840 15 3 7840 15 3 7840 15 3 7840 15 3
7840 15 3 8447 28 4 8599 28 4 9206 28 4 9206 28 4 9206 28 4
@@ -4075,12 +4444,12 @@
do_execsql_test 5.2.5.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 113 113 1
113 113 1 158 158 1 160 158 1 160 158 2 223 223 1 224 224 1
238 234 2 239 234 2 239 238 2 252 250 2 256 252 2 257 247 4
@@ -4098,12 +4467,12 @@
do_execsql_test 5.2.5.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8
{} 14 12 {} 15 13 {} 19 17 {} 20 18 {} 21 19 {} 23 21 {} 25 23
{} 34 29 {} 35 30 {} 36 31 {} 37 32 {} 38 33 {} 38 33 {} 40 34
{} 41 35 {} 42 36 {} 43 37 {} 43 37 {} 50 42 {} 56 47 {} 60 51
{} 61 52 {} 62 53 {} 64 55 {} 64 55 {} 66 56 {} 67 57 {} 68 58
@@ -4120,12 +4489,12 @@
do_execsql_test 5.2.6.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
@@ -4142,12 +4511,12 @@
do_execsql_test 5.2.6.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8
{} 11 9 {} 12 10 {} 13 11 {} 14 12 {} 15 13 {} 16 14 {} 17 15
{} 18 16 {} 19 17 {} 20 18 {} 21 19 {} 22 20 {} 23 21 {} 24 22
{} 25 23 {} 26 24 {} 31 27 {} 34 29 {} 35 30 {} 36 31 {} 37 32
{} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 42 36 {} 43 37 {} 43 37
@@ -4163,13 +4532,13 @@
do_execsql_test 5.2.7.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c , b , a
+ WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
979 102 83 979 113 80 979 113 81 979 113 82 979 133 79 979 148 78
979 158 76 979 158 77 979 160 76 979 208 75 979 223 74 979 224 73
979 234 72 979 238 71 979 239 70 979 247 69 979 250 68 979 252 67
979 256 66 979 257 65 979 295 64 979 309 64 979 330 62 979 335 61
@@ -4187,13 +4556,338 @@
do_execsql_test 5.2.7.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c , b , a
+ WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
+ ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81
+ 5640 84 84 5640 85 85 5640 86 86 7324 80 80 8123 77 77 8129 73 73
+ 8129 74 74 8163 78 78 8163 79 79 8940 71 71 8968 75 75 8968 76 76
+ 9727 66 66 9745 69 69 9745 70 70 9745 72 72 10504 65 65
+ 10504 67 67 10504 68 68 11215 64 64 11844 62 62 11920 63 63
+ 13274 60 60 13274 61 61 13897 58 58 13903 57 57 13925 56 56
+ 13937 55 55 13941 59 59 15203 53 53 15241 54 54 15832 52 52
+ 17100 48 48 17104 46 46 17104 47 47 17106 45 45 17126 49 49
+ 17126 50 50 17126 51 51 17569 42 42 17733 44 44 18176 43 43
+ 18597 40 40 18597 41 41 18952 37 37 18996 39 39 19395 38 38
+ 19760 35 35 19788 36 36 20492 32 32 20492 33 33 20498 30 30
+ 20536 34 34 20833 29 29 20871 28 28 20891 31 31 21180 27 27
+ 21752 23 23 21830 26 26 22025 21 21 22087 22 22 22087 24 24
+ 22087 25 25 22278 20 20 22316 19 19 22549 15 15 22557 14 14
+ 22573 17 17 22573 18 18 22706 10 10 22796 11 11 22796 12 12
+ 22796 13 13 22796 16 16 23022 4 4 23042 2 2 23042 3 3 23042 9 9
+ 23155 1 1 23155 5 5 23155 6 6 23155 7 7 23155 8 8}
+
+do_execsql_test 5.2.8.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {963 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 83 979 102 83
+ 979 102 83 979 102 83 979 102 83 979 102 83 979 113 82}
+
+do_execsql_test 5.2.8.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {22176 1 1 22192 1 1 22196 1 1 22226 1 1 22244 1 1 22256 1 1
+ 22310 1 1 22316 1 1 22316 1 1 22350 1 1 22378 1 1 22396 1 1
+ 22444 1 1 22450 1 1 22472 1 1 22484 1 1 22488 1 1 22488 1 1
+ 22522 1 1 22526 1 1 22526 1 1 22528 1 1 22548 1 1 22712 1 1
+ 22734 1 1 22756 1 1 22756 1 1 22762 1 1 22762 1 1 22800 1 1
+ 22800 1 1 22820 1 1 22846 1 1 22860 1 1 22898 1 1 22908 1 1
+ 22916 1 1 22932 1 1 23022 1 1 23042 1 1 23042 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1
+ 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1}
+
+do_execsql_test 5.2.9.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {667 158 0 870 113 8 870 158 0 870 158 0 870 158 0 870 158 0
+ 870 355 0 899 113 8 899 113 8 899 113 8 899 113 8 899 113 8
+ 899 113 8 899 113 8 899 113 15 899 113 15 899 113 15 899 113 15
+ 899 113 15 899 113 15 899 113 15 899 158 8 963 113 24 979 102 43
+ 979 102 43 979 102 43 979 102 43 979 102 43 979 102 43 979 102 43
+ 979 102 43 979 102 43 979 102 43 979 102 48 979 102 48 979 102 48
+ 979 102 48 979 102 48 979 102 55 979 102 55 979 102 55 979 102 55
+ 979 102 55 979 102 55 979 102 55 979 102 61 979 102 61 979 102 61
+ 979 102 61 979 102 61 979 102 61 979 102 74 979 102 74 979 102 74
+ 979 102 74 979 102 74 979 102 74 979 102 74 979 102 74 979 102 74
+ 979 102 74 979 102 74 979 102 74 979 102 74 979 102 82 979 102 82
+ 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 113 24 979 113 24 979 113 24 979 113 24 979 113 24 979 113 24
+ 979 113 24 979 113 24 979 113 32 979 113 32 979 113 32 979 113 32
+ 979 113 32 979 113 32 979 113 32 979 113 32 979 113 43}
+
+do_execsql_test 5.2.9.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {1383 84 11 1421 84 11 1651 84 11 1695 84 11 2050 84 11 2050 84 11
+ 4098 75 10 4158 75 10 4158 75 10 4740 75 10 4884 75 10 4997 75 10
+ 4997 75 10 4997 75 10 4997 75 10 6532 68 9 6666 68 9 6894 68 9
+ 6916 68 9 7337 68 9 7337 68 9 7337 68 9 9471 59 8 9487 59 8
+ 9767 59 8 10095 59 8 10317 59 8 10450 59 8 10450 59 8 10450 59 8
+ 10450 59 8 10785 51 7 11379 51 7 11714 51 7 11714 51 7 11714 51 7
+ 11714 51 7 11714 51 7 11714 51 7 12009 40 6 12381 40 6 12676 40 6
+ 12676 40 6 12676 40 6 12676 40 6 12676 40 6 12676 40 6 12676 40 6
+ 12676 40 6 12676 40 6 13418 35 5 13566 35 5 14082 35 5 14195 35 5
+ 14195 35 5 15040 28 4 15154 28 4 15999 28 4 15999 28 4 15999 28 4
+ 15999 28 4 15999 28 4 16606 22 3 16758 22 3 17365 22 3 17365 22 3
+ 17365 22 3 17365 22 3 20135 9 2 20141 9 2 20213 9 2 20447 9 2
+ 20453 9 2 20453 9 2 20599 9 2 20846 9 2 20846 9 2 20846 9 2
+ 20846 9 2 20846 9 2 20846 9 2 22244 1 1 22528 1 1 22846 1 1
+ 22916 1 1 22932 1 1 23155 1 1 23155 1 1 23155 1 1}
+
+do_execsql_test 5.2.10.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( PARTITION BY coalesce(a, '')
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {667 158 0 671 250 6 759 158 5 768 113 4 777 113 4 777 113 4
+ 777 113 4 777 252 4 792 247 12 805 250 6 805 250 6 805 250 6
+ 805 250 6 805 250 6 805 398 6 822 158 5 822 158 5 822 158 5
+ 822 158 5 822 346 5 839 113 8 840 247 12 840 247 12 840 247 12
+ 840 247 12 840 247 12 840 247 12 840 247 12 840 247 12 840 247 12
+ 840 247 12 840 247 12 840 393 12 845 224 6 870 102 10 870 158 0
+ 870 158 0 870 158 0 870 158 0 870 355 0 899 113 8 899 113 8
+ 899 113 8 899 113 8 899 113 8 899 113 8 899 113 8 899 234 8
+ 911 223 7 929 148 7 934 223 7 934 223 7 934 223 7 934 223 7
+ 934 223 7 934 223 7 934 239 7 938 102 10 938 102 10 938 102 10
+ 938 102 10 938 102 10 938 102 10 938 102 10 938 102 10 938 102 10
+ 938 148 7 938 148 7 938 148 7 938 148 7 938 148 7 938 148 7
+ 938 160 7 938 208 10 959 224 6 959 224 6 959 224 6 959 224 6
+ 959 224 6 959 238 6 963 133 8 979 133 8 979 133 8 979 133 8
+ 979 133 8 979 133 8 979 133 8 979 133 8 979 330 8}
+
+do_execsql_test 5.2.10.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( PARTITION BY coalesce(a, '')
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {295 1 1 335 1 1 607 1 1 667 1 1 742 1 1 759 1 1 845 1 1
+ 890 1 1 929 1 1 959 1 1 962 1 1 962 1 1 962 1 1 962 1 1
+ 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 1264 1 1 1264 1 1
+ 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1366 1 1 1366 1 1 1366 1 1
+ 1366 1 1 1383 1 1 1398 1 1 1406 1 1 1421 1 1 1519 1 1 1519 1 1
+ 1535 1 1 1651 1 1 1669 1 1 1682 1 1 1695 1 1 1804 1 1 1804 1 1
+ 1804 1 1 1804 1 1 1804 1 1 1897 1 1 1919 1 1 2000 1 1 2048 1 1
+ 2050 1 1 2050 1 1 2070 1 1 2086 1 1 2108 1 1 2108 1 1 2134 1 1
+ 2150 1 1 2309 1 1 2309 1 1 2309 1 1 2340 1 1 2340 1 1 2340 1 1
+ 2430 1 1 2690 1 1 2758 1 1 2770 1 1 2776 1 1 2834 1 1 2848 1 1
+ 2947 1 1 2947 1 1 2947 1 1 2947 1 1 2980 1 1 3082 1 1 3088 1 1
+ 3088 1 1 3113 1 1 3113 1 1 3113 1 1 3113 1 1 3234 1 1 3481 1 1
+ 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1}
+
+do_execsql_test 5.2.11.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {911 223 7 934 158 26 934 158 26 934 158 26 934 158 26 934 158 26
+ 934 158 33 934 223 7 934 223 7 934 223 7 934 223 7 934 223 7
+ 934 223 7 934 223 20 934 223 20 934 223 20 934 223 20 934 223 20
+ 934 223 20 934 223 20 934 223 20 934 223 20 934 223 20 934 223 20
+ 934 223 20 934 223 20 934 223 26 934 239 7 959 102 49 959 102 49
+ 959 102 49 959 102 49 959 102 49 959 102 49 959 102 49 959 102 49
+ 959 102 49 959 102 49 959 102 57 959 102 57 959 102 57 959 102 57
+ 959 102 57 959 102 57 959 102 57 959 102 57 959 113 38 959 113 38
+ 959 113 38 959 113 38 959 113 49 959 158 33 959 158 33 959 158 33
+ 959 158 33 959 158 33 959 158 33 959 158 38 963 102 58 979 102 49
+ 979 102 49 979 102 49 979 102 49 979 102 49 979 102 49 979 102 52
+ 979 102 52 979 102 52 979 102 52 979 102 52 979 102 52 979 102 52
+ 979 102 55 979 102 55 979 102 55 979 102 55 979 102 55 979 102 55
+ 979 102 55 979 102 55 979 102 55 979 102 58 979 102 58 979 102 58
+ 979 102 58 979 102 58 979 102 58 979 102 58 979 102 58}
+
+do_execsql_test 5.2.11.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {1398 1 1 1682 1 1 2000 1 1 2070 1 1 2086 1 1 2309 1 1 2309 1 1
+ 2309 1 1 5079 9 2 5085 9 2 5157 9 2 5391 9 2 5397 9 2 5397 9 2
+ 5543 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2
+ 6397 22 3 6549 22 3 7156 22 3 7156 22 3 7156 22 3 7156 22 3
+ 8001 28 4 8115 28 4 8960 28 4 8960 28 4 8960 28 4 8960 28 4
+ 8960 28 4 9702 35 5 9850 35 5 10366 35 5 10479 35 5 10479 35 5
+ 10774 40 6 11146 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6
+ 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11563 68 9
+ 11697 68 9 11776 51 7 11925 68 9 11947 68 9 12368 68 9 12368 68 9
+ 12368 68 9 12370 51 7 12530 59 8 12546 59 8 12705 51 7 12705 51 7
+ 12705 51 7 12705 51 7 12705 51 7 12705 51 7 12826 59 8
+ 13050 75 10 13110 75 10 13110 75 10 13154 59 8 13376 59 8
+ 13509 59 8 13509 59 8 13509 59 8 13509 59 8 13528 84 11
+ 13566 84 11 13692 75 10 13796 84 11 13836 75 10 13840 84 11
+ 13949 75 10 13949 75 10 13949 75 10 13949 75 10 14195 84 11
+ 14195 84 11}
+
+do_execsql_test 5.2.12.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 113 113 1
+ 113 113 1 158 158 1 160 158 1 160 158 2 223 223 1 224 224 1
+ 238 234 2 239 234 2 239 238 2 252 250 2 256 252 2 257 247 4
+ 257 247 4 257 250 3 335 330 2 336 330 2 336 335 2 355 354 1
+ 355 354 2 355 355 1 399 393 3 399 393 3 399 393 3 399 393 3
+ 399 393 4 480 480 1 480 480 1 572 572 1 574 574 1 618 618 1
+ 618 618 1 633 629 2 634 627 3 634 627 3 634 627 4 634 629 3
+ 667 667 1 670 667 2 671 667 2 671 667 2 671 667 3 711 711 1
+ 711 711 1 716 705 2 726 726 1 730 730 1 762 762 1 768 759 3
+ 768 762 2 768 762 2 792 790 2 792 790 2 794 786 3 794 786 3
+ 844 839 4 845 839 4 845 839 4 845 839 4 845 839 4 870 870 1
+ 870 870 1 870 870 2 934 934 1 938 929 3 938 934 2 938 934 2
+ 959 959 1 963 963 1}
+
+do_execsql_test 5.2.12.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8
+ {} 14 12 {} 15 13 {} 19 17 {} 20 18 {} 21 19 {} 23 21 {} 25 23
+ {} 34 29 {} 35 30 {} 36 31 {} 37 32 {} 38 33 {} 38 33 {} 40 34
+ {} 41 35 {} 42 36 {} 43 37 {} 43 37 {} 50 42 {} 56 47 {} 60 51
+ {} 61 52 {} 62 53 {} 64 55 {} 64 55 {} 66 56 {} 67 57 {} 68 58
+ {} 69 59 {} 70 60 {} 71 61 {} 72 62 {} 78 67 {} 78 67 {} 78 67
+ {} 81 68 {} 82 69 {} 83 70 {} 85 72 {} 85 72 {} 89 75 113 2 2
+ 113 2 2 223 11 9 239 12 10 239 13 11 257 18 16 335 22 20
+ 335 24 22 355 27 25 355 27 25 504 16 14 504 17 15 705 58 49
+ 710 26 24 711 57 48 711 59 50 759 63 54 929 84 71 959 88 74
+ 963 87 73 1185 32 28 1185 32 28 1191 29 26 1191 29 26 1334 51 43
+ 1334 55 46 1338 52 44 1338 52 44 1584 31 27 1678 77 66 1684 73 63
+ 1684 73 63 1885 48 40 1889 46 39 1889 46 39 1891 45 38 1891 49 41
+ 2005 54 45 2523 75 64 2523 76 65}
+
+do_execsql_test 5.2.13.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 113 113 1
+ 113 113 1 158 158 0 158 158 1 355 355 0 355 355 1 393 393 1
+ 393 393 1 399 399 0 399 399 1 480 480 1 480 480 1 618 618 1
+ 618 618 1 629 629 0 629 629 1 667 667 0 667 667 1 768 768 1
+ 768 768 1 839 839 1 839 839 1 870 870 1 870 870 1 870 870 2
+ 938 938 1 938 938 1}
+
+do_execsql_test 5.2.13.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8
+ {} 11 9 {} 12 10 {} 13 11 {} 14 12 {} 15 13 {} 16 14 {} 17 15
+ {} 18 16 {} 19 17 {} 20 18 {} 21 19 {} 22 20 {} 23 21 {} 24 22
+ {} 25 23 {} 26 24 {} 31 27 {} 34 29 {} 35 30 {} 36 31 {} 37 32
+ {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 42 36 {} 43 37 {} 43 37
+ {} 45 38 {} 48 40 {} 49 41 {} 50 42 {} 51 43 {} 54 45 {} 55 46
+ {} 56 47 {} 57 48 {} 58 49 {} 59 50 {} 60 51 {} 61 52 {} 62 53
+ {} 63 54 {} 64 55 {} 64 55 {} 66 56 {} 67 57 {} 68 58 {} 69 59
+ {} 70 60 {} 71 61 {} 72 62 {} 75 64 {} 76 65 {} 77 66 {} 78 67
+ {} 78 67 {} 78 67 {} 81 68 {} 82 69 {} 83 70 {} 84 71 {} 85 72
+ {} 85 72 {} 87 73 {} 88 74 {} 89 75 113 2 2 113 2 2 355 27 25
+ 355 27 25 393 29 26 393 29 26 399 32 28 399 32 28 629 46 39
+ 629 46 39 667 52 44 667 52 44 839 73 63 839 73 63}
+
+do_execsql_test 5.2.14.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
+ ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 83 979 113 80 979 113 81 979 113 82 979 133 79 979 148 78
+ 979 158 76 979 158 77 979 160 76 979 208 75 979 223 74 979 224 73
+ 979 234 72 979 238 71 979 239 70 979 247 69 979 250 68 979 252 67
+ 979 256 66 979 257 65 979 295 64 979 309 63 979 330 63 979 335 61
+ 979 336 60 979 346 59 979 354 58 979 355 56 979 355 58 979 393 55
+ 979 393 56 979 398 54 979 399 52 979 399 53 979 412 52 979 421 51
+ 979 430 50 979 443 49 979 480 47 979 480 48 979 572 46 979 574 46
+ 979 607 44 979 618 42 979 618 43 979 627 41 979 629 40 979 629 40
+ 979 633 39 979 634 38 979 652 37 979 660 36 979 667 34 979 667 35
+ 979 670 34 979 671 33 979 683 32 979 705 31 979 711 30 979 716 29
+ 979 726 28 979 730 27 979 759 26 979 762 25 979 768 23 979 768 24
+ 979 777 22 979 786 21 979 790 20 979 792 19 979 794 18 979 805 17
+ 979 822 16 979 839 15 979 839 15 979 840 13 979 844 12 979 845 11
+ 979 870 8 979 870 9 979 870 10 979 899 8 979 911 7}
+
+do_execsql_test 5.2.14.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81
5640 84 84 5640 85 85 5640 86 86 7324 80 80 8123 77 77 8129 73 73
8129 74 74 8163 78 78 8163 79 79 8940 71 71 8968 75 75 8968 76 76
9727 66 66 9745 69 69 9745 70 70 9745 72 72 10504 65 65
10504 67 67 10504 68 68 11215 64 64 11844 62 62 11920 63 63
@@ -4214,11 +4908,11 @@
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
@@ -4235,11 +4929,11 @@
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
@@ -4254,13 +4948,13 @@
do_execsql_test 5.3.2.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY a
+ WINDOW win AS ( ORDER BY a NULLS FIRST
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 899 113 9 899 113 9 899 113 9 899 113 9
899 113 9 899 113 9 899 113 9 899 113 16 899 113 16 899 113 16
899 113 16 899 113 16 899 113 16 899 113 16 899 113 16 899 113 16
979 102 44 979 102 44 979 102 44 979 102 44 979 102 44 979 102 49
@@ -4278,13 +4972,13 @@
do_execsql_test 5.3.2.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY a
+ WINDOW win AS ( ORDER BY a NULLS FIRST
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 81 11 {} 81 11 {} 81 11 {} 81 11 {} 81 11 {} 81 11 {} 81 11
{} 81 11 {} 81 11 2947 74 10 2947 74 10 2947 74 10 2947 74 10
2947 74 10 2947 74 10 2947 74 10 5287 65 9 5287 65 9 5287 65 9
5287 65 9 5287 65 9 5287 65 9 5287 65 9 5287 65 9 5287 65 9
8400 57 8 8400 57 8 8400 57 8 8400 57 8 8400 57 8 8400 57 8
@@ -4304,11 +4998,11 @@
min(c) OVER win,
count(a) OVER win
FROM t3
WINDOW win AS ( PARTITION BY coalesce(a, '')
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
@@ -4326,11 +5020,11 @@
rank() OVER win,
dense_rank() OVER win
FROM t3
WINDOW win AS ( PARTITION BY coalesce(a, '')
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
@@ -4345,12 +5039,12 @@
do_execsql_test 5.3.4.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 870 158 0
870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0
870 158 0 934 158 8 934 158 8 934 158 8 934 158 8 934 158 8
934 158 8 934 158 8 934 158 8 934 158 8 934 158 8 934 158 8
934 158 8 934 158 8 934 158 21 934 158 21 934 158 21 934 158 21
@@ -4368,12 +5062,12 @@
do_execsql_test 5.3.4.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 2050 7 2 2050 7 2
2050 7 2 2050 7 2 2050 7 2 2050 7 2 2050 7 2 2050 7 2 4359 15 3
4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3
4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3
7840 28 4 7840 28 4 7840 28 4 7840 28 4 7840 28 4 7840 28 4
@@ -4391,12 +5085,12 @@
do_execsql_test 5.3.5.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 158 158 1 160 160 1 160 160 1 223 223 1 224 224 1
@@ -4414,12 +5108,12 @@
do_execsql_test 5.3.5.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 2 2 {} 2 2 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6
{} 9 7 {} 10 8 {} 14 12 {} 15 13 {} 19 17 {} 20 18 {} 21 19
{} 23 21 {} 25 23 {} 27 25 {} 27 25 {} 34 29 {} 35 30 {} 36 31
{} 37 32 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 42 36 {} 43 37
{} 43 37 {} 50 42 {} 56 47 {} 60 51 {} 61 52 {} 62 53 {} 64 55
@@ -4436,12 +5130,12 @@
do_execsql_test 5.3.6.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
@@ -4457,12 +5151,12 @@
do_execsql_test 5.3.6.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 2 2 {} 2 2 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6
{} 9 7 {} 10 8 {} 11 9 {} 12 10 {} 13 11 {} 14 12 {} 15 13
{} 16 14 {} 17 15 {} 18 16 {} 19 17 {} 20 18 {} 21 19 {} 22 20
{} 23 21 {} 24 22 {} 25 23 {} 26 24 {} 27 25 {} 27 25 {} 29 26
{} 29 26 {} 31 27 {} 32 28 {} 32 28 {} 34 29 {} 35 30 {} 36 31
@@ -4478,13 +5172,13 @@
do_execsql_test 5.3.7.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c , b , a
+ WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
979 102 83 979 113 80 979 113 81 979 113 82 979 133 79 979 148 78
979 158 76 979 158 77 979 160 76 979 208 75 979 223 74 979 224 73
979 234 72 979 238 71 979 239 70 979 247 69 979 250 68 979 252 67
979 256 66 979 257 65 979 295 64 979 309 64 979 330 62 979 335 61
@@ -4502,13 +5196,328 @@
do_execsql_test 5.3.7.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c , b , a
+ WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
+ ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81
+ 5640 84 84 5640 85 85 5640 86 86 7324 80 80 8123 77 77 8129 73 73
+ 8129 74 74 8163 78 78 8163 79 79 8940 71 71 8968 75 75 8968 76 76
+ 9727 66 66 9745 69 69 9745 70 70 9745 72 72 10504 65 65
+ 10504 67 67 10504 68 68 11215 64 64 11844 62 62 11920 63 63
+ 13274 60 60 13274 61 61 13897 58 58 13903 57 57 13925 56 56
+ 13937 55 55 13941 59 59 15203 53 53 15241 54 54 15832 52 52
+ 17100 48 48 17104 46 46 17104 47 47 17106 45 45 17126 49 49
+ 17126 50 50 17126 51 51 17569 42 42 17733 44 44 18176 43 43
+ 18597 40 40 18597 41 41 18952 37 37 18996 39 39 19395 38 38
+ 19760 35 35 19788 36 36 20492 32 32 20492 33 33 20498 30 30
+ 20536 34 34 20833 29 29 20871 28 28 20891 31 31 21180 27 27
+ 21752 23 23 21830 26 26 22025 21 21 22087 22 22 22087 24 24
+ 22087 25 25 22278 20 20 22316 19 19 22549 15 15 22557 14 14
+ 22573 17 17 22573 18 18 22706 10 10 22796 11 11 22796 12 12
+ 22796 13 13 22796 16 16 23022 4 4 23042 2 2 23042 3 3 23042 9 9
+ 23155 1 1 23155 5 5 23155 6 6 23155 7 7 23155 8 8}
+
+do_execsql_test 5.3.8.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0}
+
+do_execsql_test 5.3.8.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1}
+
+do_execsql_test 5.3.9.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 870 158 0
+ 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0
+ 870 158 0 870 158 0 899 113 9 899 113 9 899 113 9 899 113 9
+ 899 113 9 899 113 9 899 113 9 899 113 16 899 113 16 899 113 16
+ 899 113 16 899 113 16 899 113 16 899 113 16 899 113 16 899 113 16
+ 979 102 44 979 102 44 979 102 44 979 102 44 979 102 44 979 102 49
+ 979 102 49 979 102 49 979 102 49 979 102 49 979 102 49 979 102 49
+ 979 102 56 979 102 56 979 102 56 979 102 56 979 102 56 979 102 56
+ 979 102 62 979 102 62 979 102 62 979 102 62 979 102 62 979 102 62
+ 979 102 62 979 102 62 979 102 62 979 102 62 979 102 62 979 102 62
+ 979 102 62 979 102 75 979 102 75 979 102 75 979 102 75 979 102 75
+ 979 102 75 979 102 75 979 102 75 979 113 25 979 113 25 979 113 25
+ 979 113 25 979 113 25 979 113 25 979 113 25 979 113 25 979 113 33
+ 979 113 33 979 113 33 979 113 33 979 113 33 979 113 33 979 113 33
+ 979 113 33 979 113 33 979 113 33 979 113 33}
+
+do_execsql_test 5.3.9.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 84 11 {} 84 11 {} 84 11 {} 84 11 {} 84 11 {} 84 11
+ 2050 75 10 2050 75 10 2050 75 10 2050 75 10 2050 75 10 2050 75 10
+ 2050 75 10 2050 75 10 2050 75 10 4997 68 9 4997 68 9 4997 68 9
+ 4997 68 9 4997 68 9 4997 68 9 4997 68 9 7337 59 8 7337 59 8
+ 7337 59 8 7337 59 8 7337 59 8 7337 59 8 7337 59 8 7337 59 8
+ 7337 59 8 10450 51 7 10450 51 7 10450 51 7 10450 51 7 10450 51 7
+ 10450 51 7 10450 51 7 10450 51 7 11714 40 6 11714 40 6 11714 40 6
+ 11714 40 6 11714 40 6 11714 40 6 11714 40 6 11714 40 6 11714 40 6
+ 11714 40 6 11714 40 6 12676 35 5 12676 35 5 12676 35 5 12676 35 5
+ 12676 35 5 14195 28 4 14195 28 4 14195 28 4 14195 28 4 14195 28 4
+ 14195 28 4 14195 28 4 15999 22 3 15999 22 3 15999 22 3 15999 22 3
+ 15999 22 3 15999 22 3 17365 9 2 17365 9 2 17365 9 2 17365 9 2
+ 17365 9 2 17365 9 2 17365 9 2 17365 9 2 17365 9 2 17365 9 2
+ 17365 9 2 17365 9 2 17365 9 2 20846 1 1 20846 1 1 20846 1 1
+ 20846 1 1 20846 1 1 20846 1 1 20846 1 1 20846 1 1}
+
+do_execsql_test 5.3.10.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( PARTITION BY coalesce(a, '')
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0}
+
+do_execsql_test 5.3.10.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( PARTITION BY coalesce(a, '')
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1}
+
+do_execsql_test 5.3.11.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 934 158 27 934 158 27 934 158 27 934 158 27 934 158 27
+ 934 158 27 934 158 27 934 223 8 934 223 8 934 223 8 934 223 8
+ 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8
+ 934 223 8 934 223 8 934 223 8 934 223 21 934 223 21 934 223 21
+ 934 223 21 934 223 21 934 223 21 959 102 50 959 102 50 959 102 50
+ 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50
+ 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50
+ 959 102 50 959 102 50 959 113 39 959 113 39 959 113 39 959 113 39
+ 959 113 39 959 113 39 959 113 39 959 113 39 959 113 39 959 113 39
+ 959 113 39 959 158 34 959 158 34 959 158 34 959 158 34 959 158 34
+ 979 102 46 979 102 46 979 102 46 979 102 46 979 102 46 979 102 46
+ 979 102 46 979 102 47 979 102 47 979 102 47 979 102 47 979 102 47
+ 979 102 47 979 102 47 979 102 47 979 102 47 979 102 49 979 102 49
+ 979 102 49 979 102 49 979 102 49 979 102 49}
+
+do_execsql_test 5.3.11.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2
+ 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 5790 22 3
+ 5790 22 3 5790 22 3 5790 22 3 5790 22 3 5790 22 3 7156 28 4
+ 7156 28 4 7156 28 4 7156 28 4 7156 28 4 7156 28 4 7156 28 4
+ 8960 35 5 8960 35 5 8960 35 5 8960 35 5 8960 35 5 10028 68 9
+ 10028 68 9 10028 68 9 10028 68 9 10028 68 9 10028 68 9 10028 68 9
+ 10396 59 8 10396 59 8 10396 59 8 10396 59 8 10396 59 8 10396 59 8
+ 10396 59 8 10396 59 8 10396 59 8 10479 40 6 10479 40 6 10479 40 6
+ 10479 40 6 10479 40 6 10479 40 6 10479 40 6 10479 40 6 10479 40 6
+ 10479 40 6 10479 40 6 11002 75 10 11002 75 10 11002 75 10
+ 11002 75 10 11002 75 10 11002 75 10 11002 75 10 11002 75 10
+ 11002 75 10 11441 51 7 11441 51 7 11441 51 7 11441 51 7
+ 11441 51 7 11441 51 7 11441 51 7 11441 51 7 12145 84 11
+ 12145 84 11 12145 84 11 12145 84 11 12145 84 11 12145 84 11}
+
+do_execsql_test 5.3.12.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 158 158 1 160 160 1 160 160 1 223 223 1 224 224 1
+ 238 234 2 239 234 2 239 238 2 252 250 2 256 252 2 257 247 4
+ 257 247 4 257 250 3 335 330 2 336 330 2 336 335 2 354 354 1
+ 354 354 1 355 355 1 398 393 3 398 393 3 399 393 3 399 398 2
+ 399 398 2 572 572 1 574 574 1 633 629 2 634 627 3 634 627 3
+ 634 627 3 634 629 3 667 667 1 670 667 2 671 667 2 671 670 2
+ 671 670 2 711 711 1 711 711 1 716 705 2 726 726 1 730 730 1
+ 762 762 1 762 762 1 762 762 1 768 759 3 792 790 2 792 790 2
+ 794 786 3 794 786 3 844 839 4 845 839 4 845 839 4 845 840 3
+ 845 840 3 934 934 1 934 934 1 934 934 1 938 929 3 959 959 1
+ 963 963 1}
+
+do_execsql_test 5.3.12.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 2 2 {} 2 2 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6
+ {} 9 7 {} 10 8 {} 14 12 {} 15 13 {} 19 17 {} 20 18 {} 21 19
+ {} 23 21 {} 25 23 {} 27 25 {} 27 25 {} 34 29 {} 35 30 {} 36 31
+ {} 37 32 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 42 36 {} 43 37
+ {} 43 37 {} 50 42 {} 56 47 {} 60 51 {} 61 52 {} 62 53 {} 64 55
+ {} 64 55 {} 66 56 {} 67 57 {} 68 58 {} 69 59 {} 70 60 {} 71 61
+ {} 72 62 {} 78 67 {} 78 67 {} 78 67 {} 81 68 {} 82 69 {} 83 70
+ {} 85 72 {} 85 72 {} 89 75 223 11 9 239 12 10 239 13 11
+ 257 18 16 335 22 20 335 24 22 504 16 14 504 17 15 671 52 44
+ 671 52 44 705 58 49 710 26 24 711 57 48 711 59 50 759 63 54
+ 786 32 28 786 32 28 798 29 26 798 29 26 845 73 63 845 73 63
+ 929 84 71 959 88 74 963 87 73 1260 46 39 1260 46 39 1334 51 43
+ 1334 55 46 1584 31 27 1678 77 66 1885 48 40 1891 45 38 1891 49 41
+ 2005 54 45 2523 75 64 2523 76 65}
+
+do_execsql_test 5.3.13.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0
+ {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0}
+
+do_execsql_test 5.3.13.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 2 2 {} 2 2 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6
+ {} 9 7 {} 10 8 {} 11 9 {} 12 10 {} 13 11 {} 14 12 {} 15 13
+ {} 16 14 {} 17 15 {} 18 16 {} 19 17 {} 20 18 {} 21 19 {} 22 20
+ {} 23 21 {} 24 22 {} 25 23 {} 26 24 {} 27 25 {} 27 25 {} 29 26
+ {} 29 26 {} 31 27 {} 32 28 {} 32 28 {} 34 29 {} 35 30 {} 36 31
+ {} 37 32 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 42 36 {} 43 37
+ {} 43 37 {} 45 38 {} 46 39 {} 46 39 {} 48 40 {} 49 41 {} 50 42
+ {} 51 43 {} 52 44 {} 52 44 {} 54 45 {} 55 46 {} 56 47 {} 57 48
+ {} 58 49 {} 59 50 {} 60 51 {} 61 52 {} 62 53 {} 63 54 {} 64 55
+ {} 64 55 {} 66 56 {} 67 57 {} 68 58 {} 69 59 {} 70 60 {} 71 61
+ {} 72 62 {} 73 63 {} 73 63 {} 75 64 {} 76 65 {} 77 66 {} 78 67
+ {} 78 67 {} 78 67 {} 81 68 {} 82 69 {} 83 70 {} 84 71 {} 85 72
+ {} 85 72 {} 87 73 {} 88 74 {} 89 75}
+
+do_execsql_test 5.3.14.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
+ ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82
+ 979 102 83 979 113 80 979 113 81 979 113 82 979 133 79 979 148 78
+ 979 158 76 979 158 77 979 160 76 979 208 75 979 223 74 979 224 73
+ 979 234 72 979 238 71 979 239 70 979 247 69 979 250 68 979 252 67
+ 979 256 66 979 257 65 979 295 64 979 309 63 979 330 63 979 335 61
+ 979 336 60 979 346 59 979 354 58 979 355 56 979 355 58 979 393 55
+ 979 393 56 979 398 54 979 399 52 979 399 53 979 412 52 979 421 51
+ 979 430 50 979 443 49 979 480 47 979 480 48 979 572 46 979 574 46
+ 979 607 44 979 618 42 979 618 43 979 627 41 979 629 40 979 629 40
+ 979 633 39 979 634 38 979 652 37 979 660 36 979 667 34 979 667 35
+ 979 670 34 979 671 33 979 683 32 979 705 31 979 711 30 979 716 29
+ 979 726 28 979 730 27 979 759 26 979 762 25 979 768 23 979 768 24
+ 979 777 22 979 786 21 979 790 20 979 792 19 979 794 18 979 805 17
+ 979 822 16 979 839 15 979 839 15 979 840 13 979 844 12 979 845 11
+ 979 870 8 979 870 9 979 870 10 979 899 8 979 911 7}
+
+do_execsql_test 5.3.14.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81
5640 84 84 5640 85 85 5640 86 86 7324 80 80 8123 77 77 8129 73 73
8129 74 74 8163 78 78 8163 79 79 8940 71 71 8968 75 75 8968 76 76
9727 66 66 9745 69 69 9745 70 70 9745 72 72 10504 65 65
10504 67 67 10504 68 68 11215 64 64 11844 62 62 11920 63 63
@@ -4529,11 +5538,11 @@
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0
158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1
238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1
257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1
346 346 1 354 354 1 355 355 0 355 355 1 393 393 1 393 393 1
@@ -4552,11 +5561,11 @@
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
@@ -4571,13 +5580,13 @@
do_execsql_test 5.4.2.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY a
+ WINDOW win AS ( ORDER BY a NULLS FIRST
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {113 113 1 234 234 1 257 257 1 336 336 1 354 354 1 768 768 1
839 839 1 839 839 1 899 113 10 899 113 10 899 113 10 899 113 10
899 113 10 899 113 10 899 113 10 899 113 17 899 113 17 899 113 17
899 113 17 899 113 17 899 113 17 899 113 17 899 899 1 963 113 17
979 102 34 979 102 45 979 102 45 979 102 45 979 102 45 979 102 45
@@ -4595,13 +5604,13 @@
do_execsql_test 5.4.2.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY a
+ WINDOW win AS ( ORDER BY a NULLS FIRST
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 81 11 {} 81 11 {} 81 11 {} 81 11 113 81 11 257 81 11
839 81 11 839 81 11 899 81 11 2947 74 10 2947 74 10 2947 74 10
3368 74 10 3390 74 10 3618 74 10 3752 74 10 5287 65 9 5287 65 9
5287 65 9 5287 65 9 5420 65 9 5642 65 9 5970 65 9 6250 65 9
6266 65 9 8400 57 8 8400 57 8 8400 57 8 8400 57 8 8400 57 8
@@ -4621,11 +5630,11 @@
min(c) OVER win,
count(a) OVER win
FROM t3
WINDOW win AS ( PARTITION BY coalesce(a, '')
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0
158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1
238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1
257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1
346 346 1 354 354 1 355 355 0 355 355 1 393 393 1 393 393 1
@@ -4645,11 +5654,11 @@
rank() OVER win,
dense_rank() OVER win
FROM t3
WINDOW win AS ( PARTITION BY coalesce(a, '')
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
@@ -4664,12 +5673,12 @@
do_execsql_test 5.4.4.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {158 158 0 355 355 0 399 399 0 629 629 0 667 667 0 870 158 1
870 158 1 870 158 1 870 158 1 870 158 1 870 158 1 870 870 0
911 158 1 934 158 1 934 158 9 934 158 9 934 158 9 934 158 9
934 158 9 934 158 9 934 158 9 934 158 9 934 158 9 934 158 9
934 158 9 934 158 9 934 158 9 934 158 22 934 158 22 934 158 22
@@ -4687,12 +5696,12 @@
do_execsql_test 5.4.4.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 1 1 355 1 1 399 1 1 629 1 1 667 1 1 2050 7 2
2050 7 2 2050 7 2 2273 7 2 2289 7 2 2359 7 2 2677 7 2 2961 7 2
4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3
4606 15 3 4752 15 3 4752 15 3 4758 15 3 4992 15 3 5064 15 3
5070 15 3 7840 28 4 7840 28 4 7840 28 4 7840 28 4 8447 28 4
@@ -4711,12 +5720,12 @@
do_execsql_test 5.4.5.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 160 158 1
160 158 2 160 158 2 208 208 1 224 223 2 224 223 2 239 234 3
239 234 3 239 234 3 252 247 3 257 247 5 257 247 5 257 250 4
257 252 3 295 295 1 309 309 1 336 330 3 336 330 3 336 330 3
346 346 1 355 354 1 355 354 2 355 354 2 399 393 3 399 393 3
@@ -4734,12 +5743,12 @@
do_execsql_test 5.4.5.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 25 23 {} 34 29
{} 36 31 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 43 37 {} 43 37
{} 50 42 {} 60 51 {} 61 52 {} 64 55 {} 64 55 {} 67 57 {} 68 58
{} 69 59 {} 70 60 {} 72 62 {} 78 67 {} 78 67 {} 78 67 {} 85 72
{} 85 72 113 2 2 113 2 2 133 4 3 223 10 8 223 11 9 239 12 10
@@ -4756,12 +5765,12 @@
do_execsql_test 5.4.6.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0
158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1
238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1
257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1
346 346 1 354 354 1 355 355 0 355 355 1 393 393 1 393 393 1
@@ -4779,12 +5788,12 @@
do_execsql_test 5.4.6.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 11 9 {} 12 10
{} 13 11 {} 16 14 {} 17 15 {} 18 16 {} 22 20 {} 24 22 {} 25 23
{} 26 24 {} 31 27 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34
{} 41 35 {} 43 37 {} 43 37 {} 49 41 {} 50 42 {} 51 43 {} 54 45
{} 59 50 {} 60 51 {} 61 52 {} 63 54 {} 64 55 {} 64 55 {} 67 57
@@ -4801,13 +5810,13 @@
do_execsql_test 5.4.7.1 {
SELECT max(c) OVER win,
min(c) OVER win,
count(a) OVER win
FROM t3
- WINDOW win AS ( ORDER BY c , b , a
+ WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
979 102 83 979 113 81 979 113 82 979 133 80 979 148 79 979 158 77
979 158 78 979 160 77 979 208 76 979 223 75 979 224 74 979 234 73
979 238 72 979 239 71 979 247 70 979 250 69 979 252 68 979 256 67
979 257 66 979 295 65 979 309 64 979 330 63 979 335 62 979 336 61
@@ -4825,13 +5834,335 @@
do_execsql_test 5.4.7.2 {
SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
rank() OVER win,
dense_rank() OVER win
FROM t3
- WINDOW win AS ( ORDER BY c , b , a
+ WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
+ ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87
+ 6485 81 81 6485 82 82 6485 83 83 7324 80 80 8163 78 78 8163 79 79
+ 8968 73 73 8968 74 74 8968 75 75 8968 76 76 8968 77 77 9745 69 69
+ 9745 70 70 9745 71 71 9745 72 72 10504 65 65 10504 66 66
+ 10504 67 67 10504 68 68 11215 64 64 11920 63 63 12603 62 62
+ 13274 60 60 13274 61 61 13941 59 59 14608 55 55 14608 56 56
+ 14608 57 57 14608 58 58 15241 54 54 15870 53 53 16499 52 52
+ 17126 49 49 17126 50 50 17126 51 51 17733 44 44 17733 45 45
+ 17733 46 46 17733 47 47 17733 48 48 18176 42 42 18176 43 43
+ 18597 40 40 18597 41 41 18996 39 39 19395 37 37 19395 38 38
+ 19788 36 36 20181 35 35 20536 34 34 20891 30 30 20891 31 31
+ 20891 32 32 20891 33 33 21226 28 28 21226 29 29 21535 27 27
+ 21830 26 26 22087 22 22 22087 23 23 22087 24 24 22087 25 25
+ 22334 21 21 22573 17 17 22573 18 18 22573 19 19 22573 20 20
+ 22796 11 11 22796 12 12 22796 13 13 22796 14 14 22796 15 15
+ 22796 16 16 22929 10 10 23042 9 9 23155 1 1 23155 2 2 23155 3 3
+ 23155 4 4 23155 5 5 23155 6 6 23155 7 7 23155 8 8}
+
+do_execsql_test 5.4.8.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0
+ 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1
+ 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1
+ 257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1
+ 346 346 1 354 354 1 355 355 0 355 355 1 393 393 1 393 393 1
+ 398 398 1 399 399 0 399 399 1 412 412 1 421 421 1 430 430 1
+ 443 443 1 480 480 1 480 480 1 572 572 1 574 574 1 607 607 1
+ 618 618 1 618 618 1 627 627 1 629 629 0 629 629 1 633 633 1
+ 634 634 1 652 652 1 660 660 1 667 667 0 667 667 1 670 670 1
+ 671 671 1 683 683 1 705 705 1 711 711 1 716 716 1 726 726 1
+ 730 730 1 759 759 1 762 762 1 768 768 1 768 768 1 777 777 1
+ 786 786 1 790 790 1 792 792 1 794 794 1 805 805 1 822 822 1
+ 839 839 1 839 839 1 840 840 1 844 844 1 845 845 1 870 870 0
+ 870 870 1 870 870 1 899 899 1 911 911 1 929 929 1 934 934 1
+ 938 938 1 938 938 1 959 959 1 963 963 1 979 979 1}
+
+do_execsql_test 5.4.8.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ 113 1 1 113 1 1 133 1 1 223 1 1 239 1 1 247 1 1 257 1 1
+ 295 1 1 309 1 1 335 1 1 355 1 1 355 1 1 393 1 1 393 1 1
+ 399 1 1 399 1 1 421 1 1 443 1 1 607 1 1 627 1 1 629 1 1
+ 629 1 1 633 1 1 667 1 1 667 1 1 671 1 1 683 1 1 705 1 1
+ 711 1 1 759 1 1 777 1 1 805 1 1 839 1 1 839 1 1 845 1 1
+ 899 1 1 911 1 1 929 1 1 959 1 1 963 1 1 979 1 1}
+
+do_execsql_test 5.4.9.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {158 158 0 355 355 0 399 399 0 629 629 0 667 667 0 870 113 1
+ 870 158 1 870 158 1 870 158 1 870 158 1 870 158 1 870 158 1
+ 870 158 1 870 870 0 899 113 10 899 113 10 899 113 10 899 113 10
+ 899 113 10 899 113 10 899 113 10 899 113 17 899 113 17 899 113 17
+ 899 113 17 899 113 17 899 113 17 899 113 17 899 158 1 963 113 17
+ 979 102 34 979 102 45 979 102 45 979 102 45 979 102 45 979 102 45
+ 979 102 50 979 102 50 979 102 50 979 102 50 979 102 50 979 102 50
+ 979 102 50 979 102 57 979 102 57 979 102 57 979 102 57 979 102 57
+ 979 102 57 979 102 63 979 102 63 979 102 63 979 102 63 979 102 63
+ 979 102 63 979 102 63 979 102 63 979 102 63 979 102 63 979 102 63
+ 979 102 63 979 102 63 979 102 76 979 102 76 979 102 76 979 102 76
+ 979 102 76 979 102 76 979 102 76 979 102 76 979 113 17 979 113 26
+ 979 113 26 979 113 26 979 113 26 979 113 26 979 113 26 979 113 26
+ 979 113 26 979 113 34 979 113 34 979 113 34 979 113 34 979 113 34
+ 979 113 34 979 113 34 979 113 34 979 113 34 979 113 34}
+
+do_execsql_test 5.4.9.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 84 11 {} 84 11 355 84 11 399 84 11 629 84 11 667 84 11
+ 2050 75 10 2050 75 10 2050 75 10 2050 75 10 2163 75 10 2307 75 10
+ 2889 75 10 2889 75 10 2949 75 10 4997 68 9 4997 68 9 4997 68 9
+ 5418 68 9 5440 68 9 5668 68 9 5802 68 9 7337 59 8 7337 59 8
+ 7337 59 8 7337 59 8 7470 59 8 7692 59 8 8020 59 8 8300 59 8
+ 8316 59 8 10450 51 7 10450 51 7 10450 51 7 10450 51 7 10450 51 7
+ 10450 51 7 10785 51 7 11379 51 7 11714 40 6 11714 40 6 11714 40 6
+ 11714 40 6 11714 40 6 11714 40 6 11714 40 6 11714 40 6 11714 40 6
+ 12009 40 6 12381 40 6 12676 35 5 12676 35 5 12789 35 5 13305 35 5
+ 13453 35 5 14195 28 4 14195 28 4 14195 28 4 14195 28 4 14195 28 4
+ 15040 28 4 15154 28 4 15999 22 3 15999 22 3 15999 22 3 15999 22 3
+ 16606 22 3 16758 22 3 17365 9 2 17365 9 2 17365 9 2 17365 9 2
+ 17365 9 2 17365 9 2 17612 9 2 17758 9 2 17758 9 2 17764 9 2
+ 17998 9 2 18070 9 2 18076 9 2 20846 1 1 20846 1 1 20846 1 1
+ 21069 1 1 21085 1 1 21155 1 1 21473 1 1 21757 1 1}
+
+do_execsql_test 5.4.10.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( PARTITION BY coalesce(a, '')
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0
+ 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1
+ 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1
+ 257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1
+ 346 346 1 354 354 1 355 355 0 355 355 1 393 393 1 393 393 1
+ 398 398 1 399 399 0 399 399 1 412 412 1 421 421 1 430 430 1
+ 443 443 1 480 480 1 480 480 1 572 572 1 574 574 1 607 607 1
+ 618 618 1 618 618 1 627 627 1 629 629 0 629 629 1 633 633 1
+ 634 634 1 652 652 1 660 660 1 667 667 0 667 667 1 670 670 1
+ 671 671 1 683 683 1 705 705 1 711 711 1 716 716 1 726 726 1
+ 730 730 1 759 759 1 762 762 1 768 768 1 768 768 1 777 777 1
+ 786 786 1 790 790 1 792 792 1 794 794 1 805 805 1 822 822 1
+ 839 839 1 839 839 1 840 840 1 844 844 1 845 845 1 870 870 0
+ 870 870 1 870 870 1 899 899 1 911 911 1 929 929 1 934 934 1
+ 938 938 1 938 938 1 959 959 1 963 963 1 979 979 1}
+
+do_execsql_test 5.4.10.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( PARTITION BY coalesce(a, '')
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1
+ 113 1 1 113 1 1 133 1 1 223 1 1 239 1 1 247 1 1 257 1 1
+ 295 1 1 309 1 1 335 1 1 355 1 1 355 1 1 393 1 1 393 1 1
+ 399 1 1 399 1 1 421 1 1 443 1 1 607 1 1 627 1 1 629 1 1
+ 629 1 1 633 1 1 667 1 1 667 1 1 671 1 1 683 1 1 705 1 1
+ 711 1 1 759 1 1 777 1 1 805 1 1 839 1 1 839 1 1 845 1 1
+ 899 1 1 911 1 1 929 1 1 959 1 1 963 1 1 979 1 1}
+
+do_execsql_test 5.4.11.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {223 223 1 239 239 1 309 309 1 572 572 1 627 627 1 870 870 1
+ 911 911 1 934 158 22 934 158 28 934 158 28 934 158 28 934 158 28
+ 934 158 28 934 158 28 934 223 9 934 223 9 934 223 9 934 223 9
+ 934 223 9 934 223 9 934 223 9 934 223 9 934 223 9 934 223 9
+ 934 223 9 934 223 9 934 223 9 934 223 22 934 223 22 934 223 22
+ 934 223 22 934 223 22 934 934 1 959 102 40 959 102 51 959 102 51
+ 959 102 51 959 102 51 959 102 51 959 102 51 959 102 51 959 102 51
+ 959 102 51 959 102 51 959 102 51 959 102 51 959 102 51 959 102 51
+ 959 102 51 959 113 35 959 113 40 959 113 40 959 113 40 959 113 40
+ 959 113 40 959 113 40 959 113 40 959 113 40 959 113 40 959 113 40
+ 959 158 28 959 158 35 959 158 35 959 158 35 959 158 35 963 102 51
+ 979 102 47 979 102 47 979 102 47 979 102 47 979 102 47 979 102 47
+ 979 102 47 979 102 48 979 102 48 979 102 48 979 102 48 979 102 48
+ 979 102 48 979 102 48 979 102 48 979 102 48 979 102 49 979 102 49
+ 979 102 49 979 102 49 979 102 49 979 102 49 979 102 51}
+
+do_execsql_test 5.4.11.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 1 1 {} 1 1 223 1 1 239 1 1 309 1 1 627 1 1 911 1 1
+ 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2556 9 2
+ 2702 9 2 2702 9 2 2708 9 2 2942 9 2 3014 9 2 3020 9 2 5790 22 3
+ 5790 22 3 5790 22 3 5790 22 3 6397 22 3 6549 22 3 7156 28 4
+ 7156 28 4 7156 28 4 7156 28 4 7156 28 4 8001 28 4 8115 28 4
+ 8960 35 5 8960 35 5 9073 35 5 9589 35 5 9737 35 5 10028 68 9
+ 10028 68 9 10028 68 9 10396 59 8 10396 59 8 10396 59 8 10396 59 8
+ 10449 68 9 10471 68 9 10479 40 6 10479 40 6 10479 40 6 10479 40 6
+ 10479 40 6 10479 40 6 10479 40 6 10479 40 6 10479 40 6 10529 59 8
+ 10699 68 9 10751 59 8 10774 40 6 10833 68 9 11002 75 10
+ 11002 75 10 11002 75 10 11002 75 10 11079 59 8 11115 75 10
+ 11146 40 6 11259 75 10 11359 59 8 11375 59 8 11441 51 7
+ 11441 51 7 11441 51 7 11441 51 7 11441 51 7 11441 51 7 11776 51 7
+ 11841 75 10 11841 75 10 11901 75 10 12145 84 11 12145 84 11
+ 12370 51 7 12500 84 11 12544 84 11 12774 84 11 12812 84 11}
+
+do_execsql_test 5.4.12.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 160 158 1
+ 160 158 2 160 158 2 208 208 1 224 223 2 224 223 2 239 234 3
+ 239 234 3 239 234 3 252 247 3 257 247 5 257 247 5 257 250 4
+ 257 252 3 295 295 1 309 309 1 336 330 3 336 330 3 336 330 3
+ 346 346 1 355 354 1 355 354 2 355 354 2 399 393 3 399 393 3
+ 399 393 3 399 393 4 399 393 4 412 412 1 421 421 1 430 430 1
+ 443 443 1 480 480 1 480 480 1 574 572 2 574 572 2 607 607 1
+ 618 618 1 618 618 1 634 627 3 634 627 4 634 627 4 634 627 4
+ 634 629 3 652 652 1 667 660 2 671 667 2 671 667 3 671 667 3
+ 671 667 3 683 683 1 711 705 2 716 705 3 716 711 2 730 726 2
+ 730 726 2 762 759 2 768 759 4 768 762 2 768 762 2 777 777 1
+ 792 786 3 794 786 4 794 786 4 794 790 3 805 805 1 822 822 1
+ 845 839 4 845 839 4 845 839 5 845 839 5 845 839 5 870 870 0
+ 870 870 1 870 870 1 899 899 1 911 911 1 934 929 2 938 929 4
+ 938 934 2 938 934 2 963 959 2 963 959 2 979 979 1}
+
+do_execsql_test 5.4.12.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 25 23 {} 34 29
+ {} 36 31 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 43 37 {} 43 37
+ {} 50 42 {} 60 51 {} 61 52 {} 64 55 {} 64 55 {} 67 57 {} 68 58
+ {} 69 59 {} 70 60 {} 72 62 {} 78 67 {} 78 67 {} 78 67 {} 85 72
+ {} 85 72 113 2 2 113 2 2 133 4 3 223 10 8 223 11 9 239 12 10
+ 239 13 11 239 14 12 247 15 13 257 18 16 257 19 17 295 20 18
+ 309 21 19 335 22 20 335 23 21 335 24 22 355 27 25 355 27 25
+ 421 35 30 443 37 32 504 16 14 504 17 15 607 42 36 683 56 47
+ 710 26 24 711 59 50 759 62 53 759 63 54 777 66 56 805 71 61
+ 899 81 68 911 82 69 929 83 70 929 84 71 979 89 75 1185 32 28
+ 1185 32 28 1191 29 26 1191 29 26 1334 51 43 1338 52 44 1338 52 44
+ 1416 57 48 1416 58 49 1584 31 27 1684 73 63 1684 73 63 1889 46 39
+ 1889 46 39 1891 49 41 1922 87 73 1922 88 74 2005 54 45 2005 55 46
+ 2518 45 38 2518 48 40 2523 75 64 2523 76 65 2523 77 66}
+
+do_execsql_test 5.4.13.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0
+ 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1
+ 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1
+ 257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1
+ 346 346 1 354 354 1 355 355 0 355 355 1 393 393 1 393 393 1
+ 398 398 1 399 399 0 399 399 1 412 412 1 421 421 1 430 430 1
+ 443 443 1 480 480 1 480 480 1 572 572 1 574 574 1 607 607 1
+ 618 618 1 618 618 1 627 627 1 629 629 0 629 629 1 633 633 1
+ 634 634 1 652 652 1 660 660 1 667 667 0 667 667 1 670 670 1
+ 671 671 1 683 683 1 705 705 1 711 711 1 716 716 1 726 726 1
+ 730 730 1 759 759 1 762 762 1 768 768 1 768 768 1 777 777 1
+ 786 786 1 790 790 1 792 792 1 794 794 1 805 805 1 822 822 1
+ 839 839 1 839 839 1 840 840 1 844 844 1 845 845 1 870 870 0
+ 870 870 1 870 870 1 899 899 1 911 911 1 929 929 1 934 934 1
+ 938 938 1 938 938 1 959 959 1 963 963 1 979 979 1}
+
+do_execsql_test 5.4.13.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 11 9 {} 12 10
+ {} 13 11 {} 16 14 {} 17 15 {} 18 16 {} 22 20 {} 24 22 {} 25 23
+ {} 26 24 {} 31 27 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34
+ {} 41 35 {} 43 37 {} 43 37 {} 49 41 {} 50 42 {} 51 43 {} 54 45
+ {} 59 50 {} 60 51 {} 61 52 {} 63 54 {} 64 55 {} 64 55 {} 67 57
+ {} 68 58 {} 69 59 {} 70 60 {} 72 62 {} 75 64 {} 76 65 {} 78 67
+ {} 78 67 {} 78 67 {} 84 71 {} 85 72 {} 85 72 113 2 2 113 2 2
+ 133 4 3 223 10 8 239 14 12 247 15 13 257 19 17 295 20 18
+ 309 21 19 335 23 21 355 27 25 355 27 25 393 29 26 393 29 26
+ 399 32 28 399 32 28 421 35 30 443 37 32 607 42 36 627 45 38
+ 629 46 39 629 46 39 633 48 40 667 52 44 667 52 44 671 55 46
+ 683 56 47 705 57 48 711 58 49 759 62 53 777 66 56 805 71 61
+ 839 73 63 839 73 63 845 77 66 899 81 68 911 82 69 929 83 70
+ 959 87 73 963 88 74 979 89 75}
+
+do_execsql_test 5.4.14.1 {
+ SELECT max(c) OVER win,
+ min(c) OVER win,
+ count(a) OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
+ ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES )
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
+} {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83
+ 979 102 83 979 113 81 979 113 82 979 133 80 979 148 79 979 158 77
+ 979 158 78 979 160 77 979 208 76 979 223 75 979 224 74 979 234 73
+ 979 238 72 979 239 71 979 247 70 979 250 69 979 252 68 979 256 67
+ 979 257 66 979 295 65 979 309 64 979 330 63 979 335 62 979 336 61
+ 979 346 60 979 354 59 979 355 57 979 355 58 979 393 56 979 393 57
+ 979 398 55 979 399 53 979 399 54 979 412 53 979 421 52 979 430 51
+ 979 443 50 979 480 48 979 480 49 979 572 47 979 574 46 979 607 45
+ 979 618 43 979 618 44 979 627 42 979 629 40 979 629 41 979 633 40
+ 979 634 39 979 652 38 979 660 37 979 667 35 979 667 36 979 670 35
+ 979 671 34 979 683 33 979 705 32 979 711 31 979 716 30 979 726 29
+ 979 730 28 979 759 27 979 762 26 979 768 24 979 768 25 979 777 23
+ 979 786 22 979 790 21 979 792 20 979 794 19 979 805 18 979 822 17
+ 979 839 15 979 839 16 979 840 14 979 844 13 979 845 12 979 870 9
+ 979 870 10 979 870 11 979 899 9 979 911 8 979 929 7}
+
+do_execsql_test 5.4.14.2 {
+ SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
+ rank() OVER win,
+ dense_rank() OVER win
+ FROM t3
+ WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES )
- ORDER BY 1 , 2 , 3
+ ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
} {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87
6485 81 81 6485 82 82 6485 83 83 7324 80 80 8163 78 78 8163 79 79
8968 73 73 8968 74 74 8968 75 75 8968 76 76 8968 77 77 9745 69 69
9745 70 70 9745 71 71 9745 72 72 10504 65 65 10504 66 66
10504 67 67 10504 68 68 11215 64 64 11920 63 63 12603 62 62
@@ -4858,18 +6189,284 @@
INSERT INTO t2 VALUES('C', 1);
} {}
do_execsql_test 6.1 {
SELECT group_concat(a, '.') OVER (
- ORDER BY b RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
+ ORDER BY b NULLS FIRST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
)
FROM t2
} {A.B A.B {}}
do_execsql_test 6.2 {
SELECT group_concat(a, '.') OVER (
- ORDER BY b DESC RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
+ ORDER BY b DESC NULLS LAST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
)
FROM t2
} {{} A.B A.B}
+
+#==========================================================================
+
+do_execsql_test 7.0 {
+ DROP TABLE IF EXISTS t2;
+ CREATE TABLE t2(a INTEGER, b INTEGER);
+
+ INSERT INTO t2 VALUES(1, 65);
+ INSERT INTO t2 VALUES(2, NULL);
+ INSERT INTO t2 VALUES(3, NULL);
+ INSERT INTO t2 VALUES(4, NULL);
+ INSERT INTO t2 VALUES(5, 66);
+ INSERT INTO t2 VALUES(6, 67);
+} {}
+
+do_execsql_test 7.1.1 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
+ );
+} {9 9 9 9 9 9}
+
+do_execsql_test 7.1.2 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+} {{} {} {} 9 9 9}
+
+do_execsql_test 7.1.3 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+} {{} {} {} 9 9 9}
+
+do_execsql_test 7.1.4 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+} {9 9 9 {} {} {}}
+
+do_execsql_test 7.1.5 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+} {9 9 9 {} {} {}}
+
+do_execsql_test 7.1.6 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
+ );
+} {{} {} 1 9 9 9}
+
+do_execsql_test 7.1.7 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+} {{} {} {} 9 9 9}
+
+do_execsql_test 7.1.8 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
+ );
+} {9 9 9 {} {} {}}
+
+do_execsql_test 7.1.9 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+} {9 9 9 {} {} {}}
+
+do_execsql_test 7.2.1 {
+ SELECT min (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
+ );
+} {2 2 2 2 2 2}
+
+do_execsql_test 7.2.2 {
+ SELECT min (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+} {{} {} {} 2 2 2}
+
+do_execsql_test 7.2.3 {
+ SELECT min (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+} {{} {} {} 2 2 2}
+
+do_execsql_test 7.2.4 {
+ SELECT min (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+} {2 2 2 {} {} {}}
+
+do_execsql_test 7.2.5 {
+ SELECT min (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+} {2 2 2 {} {} {}}
+
+do_execsql_test 7.2.6 {
+ SELECT min (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
+ );
+} {{} {} 1 2 2 2}
+
+do_execsql_test 7.2.7 {
+ SELECT min (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+} {{} {} {} 2 2 2}
+
+do_execsql_test 7.2.8 {
+ SELECT min (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
+ );
+} {2 2 2 {} {} {}}
+
+do_execsql_test 7.2.9 {
+ SELECT min (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+} {2 2 2 {} {} {}}
+
+do_execsql_test 7.3.1 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
+ );
+} {9 9 9 9 9 9}
+
+do_execsql_test 7.3.2 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+} {{} {} {} 9 9 9}
+
+do_execsql_test 7.3.3 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+} {{} {} {} 9 9 9}
+
+do_execsql_test 7.3.4 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+} {9 9 9 {} {} {}}
+
+do_execsql_test 7.3.5 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+} {9 9 9 {} {} {}}
+
+do_execsql_test 7.3.6 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
+ );
+} {{} {} 1 9 9 9}
+
+do_execsql_test 7.3.7 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+} {{} {} {} 9 9 9}
+
+do_execsql_test 7.3.8 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
+ );
+} {9 9 9 {} {} {}}
+
+do_execsql_test 7.3.9 {
+ SELECT sum (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+} {9 9 9 {} {} {}}
+
+do_execsql_test 7.4.1 {
+ SELECT max (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
+ );
+} {4 4 4 4 4 4}
+
+do_execsql_test 7.4.2 {
+ SELECT max (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+} {{} {} {} 4 4 4}
+
+do_execsql_test 7.4.3 {
+ SELECT max (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+} {{} {} {} 4 4 4}
+
+do_execsql_test 7.4.4 {
+ SELECT max (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
+ );
+} {4 4 4 {} {} {}}
+
+do_execsql_test 7.4.5 {
+ SELECT max (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
+ );
+} {4 4 4 {} {} {}}
+
+do_execsql_test 7.4.6 {
+ SELECT max (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
+ );
+} {{} {} 1 4 4 4}
+
+do_execsql_test 7.4.7 {
+ SELECT max (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+} {{} {} {} 4 4 4}
+
+do_execsql_test 7.4.8 {
+ SELECT max (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
+ );
+} {4 4 4 {} {} {}}
+
+do_execsql_test 7.4.9 {
+ SELECT max (a) OVER win FROM t2
+ WINDOW win AS (
+ ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
+ );
+} {4 4 4 {} {} {}}
finish_test
ADDED test/window9.test
Index: test/window9.test
==================================================================
--- /dev/null
+++ test/window9.test
@@ -0,0 +1,235 @@
+# 2019 June 8
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# This file implements regression tests for SQLite library.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix window9
+
+ifcapable !windowfunc {
+ finish_test
+ return
+}
+
+do_execsql_test 1.0 {
+ CREATE TABLE fruits(
+ name TEXT COLLATE NOCASE,
+ color TEXT COLLATE NOCASE
+ );
+}
+
+do_execsql_test 1.1 {
+ INSERT INTO fruits (name, color) VALUES ('apple', 'RED');
+ INSERT INTO fruits (name, color) VALUES ('APPLE', 'yellow');
+ INSERT INTO fruits (name, color) VALUES ('pear', 'YELLOW');
+ INSERT INTO fruits (name, color) VALUES ('PEAR', 'green');
+}
+
+do_execsql_test 1.2 {
+ SELECT name, color, dense_rank() OVER (ORDER BY name) FROM fruits;
+} {
+ apple RED 1
+ APPLE yellow 1
+ pear YELLOW 2
+ PEAR green 2
+}
+
+do_execsql_test 1.3 {
+ SELECT name, color,
+ dense_rank() OVER (PARTITION BY name ORDER BY color)
+ FROM fruits;
+} {
+ apple RED 1
+ APPLE yellow 2
+ PEAR green 1
+ pear YELLOW 2
+}
+
+do_execsql_test 1.4 {
+ SELECT name, color,
+ dense_rank() OVER (ORDER BY name),
+ dense_rank() OVER (PARTITION BY name ORDER BY color)
+ FROM fruits;
+} {
+ apple RED 1 1
+ APPLE yellow 1 2
+ PEAR green 2 1
+ pear YELLOW 2 2
+}
+
+do_execsql_test 1.5 {
+ SELECT name, color,
+ dense_rank() OVER (ORDER BY name),
+ dense_rank() OVER (PARTITION BY name ORDER BY color)
+ FROM fruits ORDER BY color;
+} {
+ PEAR green 2 1
+ apple RED 1 1
+ APPLE yellow 1 2
+ pear YELLOW 2 2
+}
+
+do_execsql_test 2.0 {
+ CREATE TABLE t1(a BLOB, b INTEGER, c COLLATE nocase);
+ INSERT INTO t1 VALUES(1, 2, 'abc');
+ INSERT INTO t1 VALUES(3, 4, 'ABC');
+}
+
+do_execsql_test 2.1.1 {
+ SELECT c=='Abc' FROM t1
+} {1 1}
+do_execsql_test 2.1.2 {
+ SELECT c=='Abc', rank() OVER (ORDER BY b) FROM t1
+} {1 1 1 2}
+
+do_execsql_test 2.2.1 {
+ SELECT b=='2' FROM t1
+} {1 0}
+do_execsql_test 2.2.2 {
+ SELECT b=='2', rank() OVER (ORDER BY a) FROM t1
+} {1 1 0 2}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 3.0 {
+ CREATE TABLE t1(a);
+ CREATE TABLE t2(a,b,c);
+}
+
+do_execsql_test 3.1 {
+ SELECT EXISTS(SELECT 1 FROM t1 ORDER BY sum(a) OVER ()) FROM t1;
+}
+
+do_execsql_test 3.2 {
+ SELECT sum(a) OVER () FROM t2
+ ORDER BY EXISTS(SELECT 1 FROM t2 ORDER BY sum(a) OVER ());
+}
+
+do_catchsql_test 3.3 {
+ SELECT a, sum(a) OVER (ORDER BY a DESC) FROM t2
+ ORDER BY EXISTS(
+ SELECT 1 FROM t2 ORDER BY sum(a) OVER (ORDER BY a)
+ ) OVER (ORDER BY a);
+} {1 {near "OVER": syntax error}}
+
+do_catchsql_test 3.4 {
+ SELECT y, y+1, y+2 FROM (
+ SELECT c IN (
+ SELECT min(a) OVER (),
+ (abs(row_number() OVER())+22)/19,
+ max(a) OVER () FROM t1
+ ) AS y FROM t2
+ );
+} {1 {sub-select returns 3 columns - expected 1}}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 4.0 {
+ CREATE TABLE t1(a, b TEXT);
+ INSERT INTO t1 VALUES('A', 1), ('A', 2), ('2', 1), ('2', 2);
+}
+
+do_execsql_test 4.1.1 {
+ SELECT b, b=count(*), '1,2' FROM t1 GROUP BY b;
+} {1 0 1,2 2 1 1,2}
+do_execsql_test 4.1.2 {
+ SELECT b, b=count(*), group_concat(b) OVER () FROM t1 GROUP BY b;
+} {1 0 1,2 2 1 1,2}
+
+#--------------------------------------------------------------------------
+reset_db
+do_execsql_test 5.0 {
+ CREATE TABLE t1(a, b, c, d, e);
+ CREATE INDEX i1 ON t1(a, b, c, d, e);
+}
+
+foreach {tn sql} {
+ 1 {
+ SELECT
+ sum(e) OVER (),
+ sum(e) OVER (ORDER BY a),
+ sum(e) OVER (PARTITION BY a ORDER BY b),
+ sum(e) OVER (PARTITION BY a, b ORDER BY c),
+ sum(e) OVER (PARTITION BY a, b, c ORDER BY d)
+ FROM t1;
+ }
+ 2 {
+ SELECT sum(e) OVER (PARTITION BY a ORDER BY b) FROM t1 ORDER BY a;
+ }
+} {
+ do_test 5.1.$tn {
+ execsql "EXPLAIN QUERY PLAN $sql"
+ } {~/ORDER/}
+}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 6.0 {
+ CREATE TABLE t0(c0);
+ INSERT INTO t0(c0) VALUES (0);
+}
+
+do_execsql_test 6.1 {
+ SELECT * FROM t0 WHERE
+ EXISTS (
+ SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0
+ ) >=1 AND
+ EXISTS (
+ SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0
+ ) <=1;
+} {0}
+
+do_execsql_test 6.2 {
+ SELECT * FROM t0 WHERE EXISTS (
+ SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0
+ )
+ BETWEEN 1 AND 1;
+} {0}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 7.0 {
+ DROP TABLE IF EXISTS t1;
+ CREATE TABLE t1(x, y);
+ INSERT INTO t1 VALUES(10, 1);
+ INSERT INTO t1 VALUES(20, 2);
+ INSERT INTO t1 VALUES(3, 3);
+ INSERT INTO t1 VALUES(2, 4);
+ INSERT INTO t1 VALUES(1, 5);
+} {}
+
+
+do_execsql_test 7.1 {
+ SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z
+} {
+ 7.2 8.75 10.0 11.0 15.0
+}
+
+do_execsql_test 7.2 {
+ SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (z IS y);
+} {
+ 10.0 15.0 11.0 8.75 7.2
+}
+
+do_execsql_test 7.3 {
+ SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (y IS z);
+} {
+ 10.0 15.0 11.0 8.75 7.2
+}
+
+do_execsql_test 7.4 {
+ SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY z + 0.0;
+} {
+ 7.2 8.75 10.0 11.0 15.0
+}
+
+finish_test
ADDED test/windowA.test
Index: test/windowA.test
==================================================================
--- /dev/null
+++ test/windowA.test
@@ -0,0 +1,309 @@
+# 2019-08-30
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# Test cases for RANGE BETWEEN and especially with NULLS LAST
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix windowA
+
+ifcapable !windowfunc {
+ finish_test
+ return
+}
+
+do_execsql_test 1.0 {
+ CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), d FLOAT);
+ INSERT INTO t1 VALUES
+ (1, 'A', 5.4),
+ (2, 'B', 5.55),
+ (3, 'C', 8.0),
+ (4, 'D', 10.25),
+ (5, 'E', 10.26),
+ (6, 'N', NULL),
+ (7, 'N', NULL);
+} {}
+
+do_execsql_test 1.1 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS LAST
+ RANGE BETWEEN 2.50 PRECEDING AND 2.25 FOLLOWING)
+ ORDER BY +d DESC NULLS LAST, +a;
+} [list \
+ 5 E 10.26 ED \
+ 4 D 10.25 EDC \
+ 3 C 8.0 EDC \
+ 2 B 5.55 CBA \
+ 1 A 5.4 BA \
+ 6 N NULL NN \
+ 7 N NULL NN \
+]
+
+do_execsql_test 1.2 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS FIRST
+ RANGE BETWEEN 2.50 PRECEDING AND 2.25 FOLLOWING)
+ ORDER BY +d DESC NULLS FIRST, +a;
+} [list \
+ 6 N NULL NN \
+ 7 N NULL NN \
+ 5 E 10.26 ED \
+ 4 D 10.25 EDC \
+ 3 C 8.0 EDC \
+ 2 B 5.55 CBA \
+ 1 A 5.4 BA \
+]
+
+do_execsql_test 1.3 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS LAST
+ RANGE BETWEEN 2.50 PRECEDING AND UNBOUNDED FOLLOWING)
+ ORDER BY +d DESC NULLS LAST, +a;
+} [list \
+ 5 E 10.26 EDCBANN \
+ 4 D 10.25 EDCBANN \
+ 3 C 8.0 EDCBANN \
+ 2 B 5.55 CBANN \
+ 1 A 5.4 BANN \
+ 6 N NULL NN \
+ 7 N NULL NN \
+]
+
+do_execsql_test 1.4 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS FIRST
+ RANGE BETWEEN 2.50 PRECEDING AND UNBOUNDED FOLLOWING)
+ ORDER BY +d DESC NULLS FIRST, +a;
+} [list \
+ 6 N NULL NNEDCBA \
+ 7 N NULL NNEDCBA \
+ 5 E 10.26 EDCBA \
+ 4 D 10.25 EDCBA \
+ 3 C 8.0 EDCBA \
+ 2 B 5.55 CBA \
+ 1 A 5.4 BA \
+]
+
+do_execsql_test 1.5 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS LAST
+ RANGE BETWEEN 2.50 PRECEDING AND CURRENT ROW)
+ ORDER BY +d DESC NULLS LAST, +a;
+} [list \
+ 5 E 10.26 E \
+ 4 D 10.25 ED \
+ 3 C 8.0 EDC \
+ 2 B 5.55 CB \
+ 1 A 5.4 BA \
+ 6 N NULL NN \
+ 7 N NULL NN \
+]
+
+do_execsql_test 1.6 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS FIRST
+ RANGE BETWEEN 2.50 PRECEDING AND CURRENT ROW)
+ ORDER BY +d DESC NULLS FIRST, +a;
+} [list \
+ 6 N NULL NN \
+ 7 N NULL NN \
+ 5 E 10.26 E \
+ 4 D 10.25 ED \
+ 3 C 8.0 EDC \
+ 2 B 5.55 CB \
+ 1 A 5.4 BA \
+]
+
+do_execsql_test 2.1 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS LAST
+ RANGE BETWEEN UNBOUNDED PRECEDING AND 2.25 FOLLOWING)
+ ORDER BY +d DESC NULLS LAST, +a;
+} [list \
+ 5 E 10.26 ED \
+ 4 D 10.25 EDC \
+ 3 C 8.0 EDC \
+ 2 B 5.55 EDCBA \
+ 1 A 5.4 EDCBA \
+ 6 N NULL EDCBANN \
+ 7 N NULL EDCBANN \
+]
+
+do_execsql_test 2.2 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS FIRST
+ RANGE BETWEEN UNBOUNDED PRECEDING AND 2.25 FOLLOWING)
+ ORDER BY +d DESC NULLS FIRST, +a;
+} [list \
+ 6 N NULL NN \
+ 7 N NULL NN \
+ 5 E 10.26 NNED \
+ 4 D 10.25 NNEDC \
+ 3 C 8.0 NNEDC \
+ 2 B 5.55 NNEDCBA \
+ 1 A 5.4 NNEDCBA \
+]
+
+do_execsql_test 2.3 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS LAST
+ RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ ORDER BY +d DESC NULLS LAST, +a;
+} [list \
+ 5 E 10.26 EDCBANN \
+ 4 D 10.25 EDCBANN \
+ 3 C 8.0 EDCBANN \
+ 2 B 5.55 EDCBANN \
+ 1 A 5.4 EDCBANN \
+ 6 N NULL EDCBANN \
+ 7 N NULL EDCBANN \
+]
+
+do_execsql_test 2.4 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS FIRST
+ RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ ORDER BY +d DESC NULLS FIRST, +a;
+} [list \
+ 6 N NULL NNEDCBA \
+ 7 N NULL NNEDCBA \
+ 5 E 10.26 NNEDCBA \
+ 4 D 10.25 NNEDCBA \
+ 3 C 8.0 NNEDCBA \
+ 2 B 5.55 NNEDCBA \
+ 1 A 5.4 NNEDCBA \
+]
+
+do_execsql_test 2.5 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS LAST
+ RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+ ORDER BY +d DESC NULLS LAST, +a;
+} [list \
+ 5 E 10.26 E \
+ 4 D 10.25 ED \
+ 3 C 8.0 EDC \
+ 2 B 5.55 EDCB \
+ 1 A 5.4 EDCBA \
+ 6 N NULL EDCBANN \
+ 7 N NULL EDCBANN \
+]
+
+do_execsql_test 2.6 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS FIRST
+ RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+ ORDER BY +d DESC NULLS FIRST, +a;
+} [list \
+ 6 N NULL NN \
+ 7 N NULL NN \
+ 5 E 10.26 NNE \
+ 4 D 10.25 NNED \
+ 3 C 8.0 NNEDC \
+ 2 B 5.55 NNEDCB \
+ 1 A 5.4 NNEDCBA \
+]
+
+
+do_execsql_test 3.1 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND 2.25 FOLLOWING)
+ ORDER BY +d DESC NULLS LAST, +a;
+} [list \
+ 5 E 10.26 ED \
+ 4 D 10.25 DC \
+ 3 C 8.0 C \
+ 2 B 5.55 BA \
+ 1 A 5.4 A \
+ 6 N NULL NN \
+ 7 N NULL NN \
+]
+
+do_execsql_test 3.2 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS FIRST
+ RANGE BETWEEN CURRENT ROW AND 2.25 FOLLOWING)
+ ORDER BY +d DESC NULLS FIRST, +a;
+} [list \
+ 6 N NULL NN \
+ 7 N NULL NN \
+ 5 E 10.26 ED \
+ 4 D 10.25 DC \
+ 3 C 8.0 C \
+ 2 B 5.55 BA \
+ 1 A 5.4 A \
+]
+
+do_execsql_test 3.3 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS LAST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
+ ORDER BY +d DESC NULLS LAST, +a;
+} [list \
+ 5 E 10.26 EDCBANN \
+ 4 D 10.25 DCBANN \
+ 3 C 8.0 CBANN \
+ 2 B 5.55 BANN \
+ 1 A 5.4 ANN \
+ 6 N NULL NN \
+ 7 N NULL NN \
+]
+
+do_execsql_test 3.4 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS FIRST
+ RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
+ ORDER BY +d DESC NULLS FIRST, +a;
+} [list \
+ 6 N NULL NNEDCBA \
+ 7 N NULL NNEDCBA \
+ 5 E 10.26 EDCBA \
+ 4 D 10.25 DCBA \
+ 3 C 8.0 CBA \
+ 2 B 5.55 BA \
+ 1 A 5.4 A \
+]
+
+do_execsql_test 4.0 {
+ SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1
+ WINDOW w1 AS
+ (ORDER BY d DESC NULLS FIRST
+ RANGE BETWEEN 2.50 PRECEDING AND 0.5 PRECEDING)
+ ORDER BY +d DESC NULLS FIRST, +a;
+} [list \
+ 6 N NULL NN \
+ 7 N NULL NN \
+ 5 E 10.26 {} \
+ 4 D 10.25 {} \
+ 3 C 8.0 ED \
+ 2 B 5.55 C \
+ 1 A 5.4 {} \
+]
+
+
+finish_test
ADDED test/windowB.test
Index: test/windowB.test
==================================================================
--- /dev/null
+++ test/windowB.test
@@ -0,0 +1,339 @@
+# 2019-08-30
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# Test cases for RANGE BETWEEN and especially with NULLS LAST
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix windowB
+
+ifcapable !windowfunc {
+ finish_test
+ return
+}
+
+do_execsql_test 1.0 {
+ CREATE TABLE t1(a, b);
+ INSERT INTO t1 VALUES(NULL, 1);
+ INSERT INTO t1 VALUES(NULL, 2);
+ INSERT INTO t1 VALUES(NULL, 3);
+} {}
+
+foreach {tn win} {
+ 1 { ORDER BY a RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING }
+ 2 { ORDER BY a NULLS LAST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING }
+ 3 { ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING }
+ 4 { ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING }
+
+ 5 { ORDER BY a NULLS LAST RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING }
+ 6 { ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING }
+
+ 7 { ORDER BY a NULLS LAST RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING }
+ 8 { ORDER BY a DESC NULLS FIRST RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING }
+} {
+ do_execsql_test 1.$tn "
+ SELECT sum(b) OVER win FROM t1
+ WINDOW win AS ( $win )
+ " {6 6 6}
+}
+
+do_execsql_test 1.2 {
+ SELECT sum(b) OVER win FROM t1
+ WINDOW win AS (
+ ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
+ )
+} {6 6 6}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 2.0 {
+ CREATE TABLE t1(a, b);
+ INSERT INTO t1 VALUES(1, NULL);
+ INSERT INTO t1 VALUES(2, 45);
+ INSERT INTO t1 VALUES(3, 66.2);
+ INSERT INTO t1 VALUES(4, 'hello world');
+ INSERT INTO t1 VALUES(5, 'hello world');
+ INSERT INTO t1 VALUES(6, X'1234');
+ INSERT INTO t1 VALUES(7, X'1234');
+ INSERT INTO t1 VALUES(8, NULL);
+}
+
+foreach {tn win} {
+ 1 "ORDER BY b RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING"
+ 2 "ORDER BY b RANGE BETWEEN 2 FOLLOWING AND 2 FOLLOWING"
+ 3 "ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING"
+ 4 "ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 2 FOLLOWING"
+} {
+ do_execsql_test 2.1.$tn "
+ SELECT a, sum(a) OVER win FROM t1
+ WINDOW win AS ( $win )
+ ORDER BY 1
+ " {1 9 2 {} 3 {} 4 9 5 9 6 13 7 13 8 9}
+}
+
+#-------------------------------------------------------------------------
+ifcapable json1 {
+ reset_db
+ do_execsql_test 3.0 {
+ CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT, x TEXT);
+ INSERT INTO testjson VALUES(1, '{"a":1}', 'a');
+ INSERT INTO testjson VALUES(2, '{"b":2}', 'b');
+ INSERT INTO testjson VALUES(3, '{"c":3}', 'c');
+ INSERT INTO testjson VALUES(4, '{"d":4}', 'd');
+ }
+
+ do_execsql_test 3.1 {
+ SELECT json_group_array(json(j)) FROM testjson;
+ } {
+ {[{"a":1},{"b":2},{"c":3},{"d":4}]}
+ }
+
+ do_execsql_test 3.2 {
+ SELECT json_group_array(json(j)) OVER (ORDER BY id) FROM testjson;
+ } {
+ {[{"a":1}]}
+ {[{"a":1},{"b":2}]}
+ {[{"a":1},{"b":2},{"c":3}]}
+ {[{"a":1},{"b":2},{"c":3},{"d":4}]}
+ }
+
+ do_execsql_test 3.3 {
+ SELECT json_group_array(json(j)) OVER (
+ ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+ EXCLUDE TIES
+ ) FROM testjson;
+ } {
+ {[{"a":1}]}
+ {[{"a":1},{"b":2}]}
+ {[{"a":1},{"b":2},{"c":3}]}
+ {[{"a":1},{"b":2},{"c":3},{"d":4}]}
+ }
+
+ do_execsql_test 3.4 {
+ SELECT json_group_array(json(j)) OVER (
+ ORDER BY id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
+ ) FROM testjson;
+ } {
+ {[{"a":1},{"b":2}]}
+ {[{"a":1},{"b":2},{"c":3}]}
+ {[{"b":2},{"c":3},{"d":4}]}
+ {[{"c":3},{"d":4}]}
+ }
+
+ do_execsql_test 3.5 {
+ SELECT json_group_array(json(j)) OVER (
+ ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
+ ) FROM testjson;
+ } {
+ {[]}
+ {[{"a":1}]}
+ {[{"a":1},{"b":2}]}
+ {[{"b":2},{"c":3}]}
+ }
+
+ do_execsql_test 3.5a {
+ UPDATE testjson SET j = replace(j,char(125),',"e":9'||char(125));
+ SELECT j FROM testjson;
+ } {
+ {{"a":1,"e":9}}
+ {{"b":2,"e":9}}
+ {{"c":3,"e":9}}
+ {{"d":4,"e":9}}
+ }
+ do_execsql_test 3.5b {
+ SELECT group_concat(x,'') OVER (
+ ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
+ ) FROM testjson ORDER BY id;
+ } {bc cd d {}}
+ do_execsql_test 3.5c {
+ SELECT json_group_array(json(j)) OVER (
+ ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
+ ) FROM testjson;
+ } {
+ {[{"b":2,"e":9},{"c":3,"e":9}]}
+ {[{"c":3,"e":9},{"d":4,"e":9}]}
+ {[{"d":4,"e":9}]}
+ {[]}
+ }
+ do_execsql_test 3.5d {
+ SELECT json_group_object(x,json(j)) OVER (
+ ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
+ ) FROM testjson;
+ } {
+ {{"b":{"b":2,"e":9},"c":{"c":3,"e":9}}}
+ {{"c":{"c":3,"e":9},"d":{"d":4,"e":9}}}
+ {{"d":{"d":4,"e":9}}}
+ {{}}
+ }
+
+ do_execsql_test 3.7b {
+ SELECT group_concat(x,'') FILTER (WHERE id!=2) OVER (
+ ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
+ ) FROM testjson;
+ } {{} a a c}
+
+ do_execsql_test 3.7c {
+ SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER (
+ ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
+ ) FROM testjson
+ } {
+ {[]}
+ {[{"a":1,"e":9}]}
+ {[{"a":1,"e":9}]}
+ {[{"c":3,"e":9}]}
+ }
+ do_execsql_test 3.7d {
+ SELECT json_group_object(x,json(j)) FILTER (WHERE id!=2) OVER (
+ ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
+ ) FROM testjson
+ } {
+ {{}}
+ {{"a":{"a":1,"e":9}}}
+ {{"a":{"a":1,"e":9}}}
+ {{"c":{"c":3,"e":9}}}
+ }
+}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 4.0 {
+ CREATE TABLE x(a);
+ INSERT INTO x VALUES(1);
+ INSERT INTO x VALUES(2);
+}
+
+do_execsql_test 4.1 {
+ WITH y AS (
+ SELECT Row_Number() OVER (win) FROM x WINDOW win AS (PARTITION BY a)
+ )
+ SELECT * FROM y;
+} {
+ 1 1
+}
+
+do_catchsql_test 4.2 {
+ WITH y AS (
+ SELECT Row_Number() OVER (win) FROM x WINDOW win AS (PARTITION
+ BY fake_column))
+ SELECT * FROM y;
+} {1 {no such column: fake_column}}
+
+do_catchsql_test 4.3 {
+ SELECT 1 WINDOW win AS (PARTITION BY fake_column);
+} {0 1}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 5.0 {
+ CREATE TABLE t1(a, c);
+ CREATE INDEX i1 ON t1(a);
+
+ INSERT INTO t1 VALUES(0, 421);
+ INSERT INTO t1 VALUES(1, 844);
+ INSERT INTO t1 VALUES(2, 1001);
+}
+
+do_execsql_test 5.1 {
+ SELECT a, sum(c) OVER (
+ ORDER BY a RANGE BETWEEN 0 PRECEDING AND 3 PRECEDING
+ ) FROM t1;
+} {0 {} 1 {} 2 {}}
+
+do_execsql_test 5.2 {
+ INSERT INTO t1 VALUES(NULL, 123);
+ INSERT INTO t1 VALUES(NULL, 111);
+ INSERT INTO t1 VALUES('xyz', 222);
+ INSERT INTO t1 VALUES('xyz', 333);
+
+ SELECT a, sum(c) OVER (
+ ORDER BY a RANGE BETWEEN 0 PRECEDING AND 3 PRECEDING
+ ) FROM t1;
+} {{} 234 {} 234 0 {} 1 {} 2 {} xyz 555 xyz 555}
+
+do_execsql_test 5.3 {
+ SELECT a, sum(c) OVER (
+ ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING
+ ) FROM t1;
+} {{} 234 {} 234 0 {} 1 {} 2 {} xyz 555 xyz 555}
+
+do_execsql_test 5.4 {
+ SELECT a, sum(c) OVER (
+ ORDER BY a RANGE BETWEEN 0 PRECEDING AND 3 PRECEDING EXCLUDE NO OTHERS
+ ) FROM t1;
+} {{} 234 {} 234 0 {} 1 {} 2 {} xyz 555 xyz 555}
+
+do_execsql_test 5.5 {
+ SELECT a, sum(c) OVER (
+ ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING EXCLUDE NO OTHERS
+ ) FROM t1;
+} {{} 234 {} 234 0 {} 1 {} 2 {} xyz 555 xyz 555}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 6.0 {
+ CREATE TABLE t1(a, c);
+ CREATE INDEX i1 ON t1(a);
+
+ INSERT INTO t1 VALUES(7, 997);
+ INSERT INTO t1 VALUES(8, 997);
+ INSERT INTO t1 VALUES('abc', 1001);
+}
+do_execsql_test 6.1 {
+ SELECT a, sum(c) OVER (
+ ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING
+ ) FROM t1;
+} {7 {} 8 {} abc 1001}
+do_execsql_test 6.2 {
+ SELECT a, sum(c) OVER (
+ ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING EXCLUDE NO OTHERS
+ ) FROM t1;
+} {7 {} 8 {} abc 1001}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 7.0 {
+ CREATE TABLE t1(a, c);
+ CREATE INDEX i1 ON t1(a);
+
+ INSERT INTO t1 VALUES(NULL, 46);
+ INSERT INTO t1 VALUES(NULL, 45);
+ INSERT INTO t1 VALUES(7, 997);
+ INSERT INTO t1 VALUES(7, 1000);
+ INSERT INTO t1 VALUES(8, 997);
+ INSERT INTO t1 VALUES(8, 1000);
+ INSERT INTO t1 VALUES('abc', 1001);
+ INSERT INTO t1 VALUES('abc', 1004);
+ INSERT INTO t1 VALUES('xyz', 3333);
+}
+
+do_execsql_test 7.1 {
+ SELECT a, max(c) OVER (
+ ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING
+ ) FROM t1;
+} {{} 46 {} 46 7 {} 7 {} 8 {} 8 {} abc 1004 abc 1004 xyz 3333}
+do_execsql_test 7.2 {
+ SELECT a, min(c) OVER (
+ ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING
+ ) FROM t1;
+} {{} 45 {} 45 7 {} 7 {} 8 {} 8 {} abc 1001 abc 1001 xyz 3333}
+
+do_execsql_test 7.3 {
+ SELECT a, max(c) OVER (
+ ORDER BY a RANGE BETWEEN 0 PRECEDING AND 2 PRECEDING
+ ) FROM t1;
+} {{} 46 {} 46 7 {} 7 {} 8 {} 8 {} abc 1004 abc 1004 xyz 3333}
+do_execsql_test 7.4 {
+ SELECT a, min(c) OVER (
+ ORDER BY a RANGE BETWEEN 0 PRECEDING AND 2 PRECEDING
+ ) FROM t1;
+} {{} 45 {} 45 7 {} 7 {} 8 {} 8 {} abc 1001 abc 1001 xyz 3333}
+
+finish_test
Index: test/windowerr.tcl
==================================================================
--- test/windowerr.tcl
+++ test/windowerr.tcl
@@ -62,8 +62,11 @@
errorsql_test 3.2 {
SELECT sum(a) OVER win FROM t1
WINDOW win AS (ROWS BETWEEN 10 PRECEDING AND x'ABCD' FOLLOWING)
}
+errorsql_test 3.3 {
+ SELECT row_number(a) OVER () FROM t1;
+}
finish_test
Index: test/windowerr.test
==================================================================
--- test/windowerr.test
+++ test/windowerr.test
@@ -105,7 +105,12 @@
# PG says ERROR: argument of ROWS must be type bigint, not type bit
do_test 3.2 { catch { execsql {
SELECT sum(a) OVER win FROM t1
WINDOW win AS (ROWS BETWEEN 10 PRECEDING AND x'ABCD' FOLLOWING)
} } } 1
+
+# PG says ERROR: function row_number(integer) does not exist
+do_test 3.3 { catch { execsql {
+ SELECT row_number(a) OVER () FROM t1;
+} } } 1
finish_test
Index: test/windowfault.test
==================================================================
--- test/windowfault.test
+++ test/windowfault.test
@@ -207,20 +207,43 @@
set ret [expr $::tmp_read_fail<=0]
unset -nocomplain ::tmp_read_fail
return $ret
}
+set L [db eval {SELECT 0.0 FROM t}]
do_faultsim_test 9 -end 25 -faults tmpread -body {
execsql {
SELECT sum(y) OVER win FROM t
WINDOW win AS (
ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING AND 1800 FOLLOWING
)
}
} -test {
- faultsim_test_result {0 {}}
+ faultsim_test_result [list 0 $::L]
}
catch {db close}
tvfs delete
+
+reset_db
+do_execsql_test 10.0 {
+ CREATE TABLE t1(a, b, c, d);
+ CREATE TABLE t2(a, b, c, d);
+}
+
+do_faultsim_test 1 -faults oom* -prep {
+} -body {
+ execsql {
+ SELECT row_number() OVER win
+ FROM t1
+ WINDOW win AS (
+ ORDER BY (
+ SELECT percent_rank() OVER win2 FROM t2
+ WINDOW win2 AS (ORDER BY a)
+ )
+ )
+ }
+} -test {
+ faultsim_test_result {0 {}}
+}
finish_test
Index: test/with1.test
==================================================================
--- test/with1.test
+++ test/with1.test
@@ -1088,7 +1088,56 @@
)
SELECT 3 FROM c,c,c,c,c,c,c,c,c
)
SELECT 4 FROM c,c,c,c,c,c,c,c,c;
} {1 {too many FROM clause terms, max: 200}}
+
+# 2019-05-22
+# ticket https://www.sqlite.org/src/tktview/ce823231949d3abf42453c8f20
+#
+sqlite3 db :memory:
+do_execsql_test 23.1 {
+ CREATE TABLE t1(id INTEGER NULL PRIMARY KEY, name Text);
+ INSERT INTO t1 VALUES (1, 'john');
+ INSERT INTO t1 VALUES (2, 'james');
+ INSERT INTO t1 VALUES (3, 'jingle');
+ INSERT INTO t1 VALUES (4, 'himer');
+ INSERT INTO t1 VALUES (5, 'smith');
+ CREATE VIEW v2 AS
+ WITH t4(Name) AS (VALUES ('A'), ('B'))
+ SELECT Name Name FROM t4;
+ CREATE VIEW v3 AS
+ WITH t4(Att, Val, Act) AS (VALUES
+ ('C', 'D', 'E'),
+ ('F', 'G', 'H')
+ )
+ SELECT D.Id Id, P.Name Protocol, T.Att Att, T.Val Val, T.Act Act
+ FROM t1 D
+ CROSS JOIN v2 P
+ CROSS JOIN t4 T;
+ SELECT * FROM v3;
+} {1 A C D E 1 A F G H 1 B C D E 1 B F G H 2 A C D E 2 A F G H 2 B C D E 2 B F G H 3 A C D E 3 A F G H 3 B C D E 3 B F G H 4 A C D E 4 A F G H 4 B C D E 4 B F G H 5 A C D E 5 A F G H 5 B C D E 5 B F G H}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 24.1 {
+ CREATE TABLE t1(a, b, c);
+ CREATE VIEW v1 AS SELECT max(a), min(b) FROM t1 GROUP BY c;
+}
+do_test 24.1 {
+ set program [db eval {EXPLAIN SELECT 1 FROM v1,v1,v1}]
+ expr [lsearch $program OpenDup]>0
+} {1}
+do_execsql_test 24.2 {
+ ATTACH "" AS aux;
+ CREATE VIEW aux.v3 AS VALUES(1);
+ CREATE VIEW main.v3 AS VALUES(3);
+
+ CREATE VIEW aux.v2 AS SELECT * FROM v3;
+ CREATE VIEW main.v2 AS SELECT * FROM v3;
+
+ SELECT * FROM main.v2 AS a, aux.v2 AS b, aux.v2 AS c, main.v2 AS d;
+} {
+ 3 1 1 3
+}
finish_test
Index: test/with3.test
==================================================================
--- test/with3.test
+++ test/with3.test
@@ -28,11 +28,19 @@
WITH i(x) AS (
WITH j AS (SELECT 10)
SELECT 5 FROM t0 UNION SELECT 8 FROM m
)
SELECT * FROM i;
-} {1 {no such table: m}}
+} {1 {no such table: t0}}
+
+# 2019-11-09 dbfuzzcheck find
+do_catchsql_test 1.1 {
+ CREATE VIEW v1(x,y) AS
+ WITH t1(a,b) AS (VALUES(1,2))
+ SELECT * FROM nosuchtable JOIN t1;
+ SELECT * FROM v1;
+} {1 {no such table: main.nosuchtable}}
# Additional test cases that came out of the work to
# fix for Kostya's problem.
#
do_execsql_test 2.0 {
@@ -127,7 +135,43 @@
| `--SCAN TABLE c
|--SCAN SUBQUERY xxxxxx
|--SEARCH TABLE w2 USING INTEGER PRIMARY KEY (rowid=?)
`--SEARCH TABLE w1 USING INTEGER PRIMARY KEY (rowid=?)
}
+
+do_execsql_test 4.0 {
+ WITH t5(t5col1) AS (
+ SELECT (
+ WITH t3(t3col1) AS (
+ WITH t2 AS (
+ WITH t1 AS (SELECT 1 AS c1 GROUP BY 1)
+ SELECT a.c1 FROM t1 AS a, t1 AS b
+ WHERE anoncol1 = 1
+ )
+ SELECT (SELECT 1 FROM t2) FROM t2
+ )
+ SELECT t3col1 FROM t3 WHERE t3col1
+ ) FROM (SELECT 1 AS anoncol1)
+ )
+ SELECT t5col1, t5col1 FROM t5
+} {1 1}
+do_execsql_test 4.1 {
+ SELECT EXISTS (
+ WITH RECURSIVE Table0 AS (
+ WITH RECURSIVE Table0(Col0) AS (SELECT ALL 1 )
+ SELECT ALL (
+ WITH RECURSIVE Table0 AS (
+ WITH RECURSIVE Table0 AS (
+ WITH RECURSIVE Table0 AS (SELECT DISTINCT 1 GROUP BY 1 )
+ SELECT DISTINCT * FROM Table0 NATURAL INNER JOIN Table0
+ WHERE Col0 = 1
+ )
+ SELECT ALL (SELECT DISTINCT * FROM Table0) FROM Table0 WHERE Col0 = 1
+ )
+ SELECT ALL * FROM Table0 NATURAL INNER JOIN Table0
+ ) FROM Table0 )
+ SELECT DISTINCT * FROM Table0 NATURAL INNER JOIN Table0
+ );
+} {1}
+
finish_test
Index: test/without_rowid1.test
==================================================================
--- test/without_rowid1.test
+++ test/without_rowid1.test
@@ -14,10 +14,14 @@
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix without_rowid1
+
+proc do_execsql_test_if_vtab {tn sql {res {}}} {
+ ifcapable vtab { uplevel [list do_execsql_test $tn $sql $res] }
+}
# Create and query a WITHOUT ROWID table.
#
do_execsql_test without_rowid1-1.0 {
CREATE TABLE t1(a,b,c,d, PRIMARY KEY(c,a)) WITHOUT ROWID;
@@ -28,10 +32,14 @@
INSERT INTO t1 VALUES('arctic','sleep','ammonia','helena');
SELECT *, '|' FROM t1 ORDER BY c, a;
} {arctic sleep ammonia helena | journal sherman ammonia helena | dynamic juliet flipper command | journal sherman gamma patriot |}
integrity_check without_rowid1-1.0ic
+
+do_execsql_test_if_vtab without_rowid1-1.0ixi {
+ SELECT name, key FROM pragma_index_xinfo('t1');
+} {c 1 a 1 b 0 d 0}
do_execsql_test without_rowid1-1.1 {
SELECT *, '|' FROM t1 ORDER BY +c, a;
} {arctic sleep ammonia helena | journal sherman ammonia helena | dynamic juliet flipper command | journal sherman gamma patriot |}
@@ -96,15 +104,10 @@
#
do_execsql_test without_rowid1-1.50 {
ANALYZE;
SELECT * FROM sqlite_stat1 ORDER BY idx;
} {t1 t1 {4 2 1} t1 t1bd {4 2 2}}
-ifcapable stat3 {
- do_execsql_test without_rowid1-1.51 {
- SELECT DISTINCT tbl, idx FROM sqlite_stat3 ORDER BY idx;
- } {t1 t1 t1 t1bd}
-}
ifcapable stat4 {
do_execsql_test without_rowid1-1.52 {
SELECT DISTINCT tbl, idx FROM sqlite_stat4 ORDER BY idx;
} {t1 t1 t1 t1bd}
}
@@ -118,10 +121,13 @@
} {abc def}
do_execsql_test 2.1.2 {
UPDATE t4 SET a = 'ABC';
SELECT * FROM t4;
} {ABC def}
+do_execsql_test_if_vtab 2.1.3 {
+ SELECT name, coll, key FROM pragma_index_xinfo('t4');
+} {a nocase 1 b BINARY 0}
do_execsql_test 2.2.1 {
DROP TABLE t4;
CREATE TABLE t4 (b, a COLLATE nocase PRIMARY KEY) WITHOUT ROWID;
INSERT INTO t4(a, b) VALUES('abc', 'def');
@@ -130,16 +136,26 @@
do_execsql_test 2.2.2 {
UPDATE t4 SET a = 'ABC', b = 'xyz';
SELECT * FROM t4;
} {xyz ABC}
+
+do_execsql_test_if_vtab 2.2.3 {
+ SELECT name, coll, key FROM pragma_index_xinfo('t4');
+} {a nocase 1 b BINARY 0}
+
do_execsql_test 2.3.1 {
CREATE TABLE t5 (a, b, PRIMARY KEY(b, a)) WITHOUT ROWID;
INSERT INTO t5(a, b) VALUES('abc', 'def');
UPDATE t5 SET a='abc', b='def';
} {}
+
+do_execsql_test_if_vtab 2.3.2 {
+ SELECT name, coll, key FROM pragma_index_xinfo('t5');
+} {b BINARY 1 a BINARY 1}
+
do_execsql_test 2.4.1 {
CREATE TABLE t6 (
a COLLATE nocase, b, c UNIQUE, PRIMARY KEY(b, a)
) WITHOUT ROWID;
@@ -150,10 +166,15 @@
do_execsql_test 2.4.2 {
SELECT * FROM t6 ORDER BY b, a;
SELECT * FROM t6 ORDER BY c;
} {ABC def ghi ABC def ghi}
+
+do_execsql_test_if_vtab 2.4.3 {
+ SELECT name, coll, key FROM pragma_index_xinfo('t6');
+} {b BINARY 1 a nocase 1 c BINARY 0}
+
#-------------------------------------------------------------------------
# Unless the destination table is completely empty, the xfer optimization
# is disabled for WITHOUT ROWID tables. The following tests check for
# some problems that might occur if this were not the case.
@@ -389,7 +410,47 @@
END;
UPDATE t1 SET c = c+1 WHERE a = 'a';
SELECT * FROM t1;
} {b a 3 b b 4}
+# 2019-04-29 ticket https://www.sqlite.org/src/info/3182d3879020ef3
+do_execsql_test 11.1 {
+ CREATE TABLE t11(a TEXT PRIMARY KEY, b INT) WITHOUT ROWID;
+ CREATE INDEX t11a ON t11(a COLLATE NOCASE);
+ INSERT INTO t11(a,b) VALUES ('A',1),('a',2);
+ PRAGMA integrity_check;
+ SELECT a FROM t11 ORDER BY a COLLATE binary;
+} {ok A a}
+
+# 2019-05-13 ticket https://www.sqlite.org/src/info/bba7b69f9849b5b
+do_execsql_test 12.1 {
+ DROP TABLE IF EXISTS t0;
+ CREATE TABLE t0 (c0 INTEGER PRIMARY KEY DESC, c1 UNIQUE DEFAULT NULL) WITHOUT ROWID;
+ INSERT INTO t0(c0) VALUES (1), (2), (3), (4), (5);
+ REINDEX;
+ PRAGMA integrity_check;
+} {ok}
+
+# 2019-11-07 ticket https://www.sqlite.org/src/info/302027baf1374498
+# The xferCompatibleIndex() function confuses a PRIMARY KEY index
+# with a UNIQUE index.
+#
+do_execsql_test 13.10 {
+ DROP TABLE IF EXISTS t0;
+ DROP TABLE IF EXISTS t1;
+ CREATE TABLE t0(
+ c0,
+ c1 UNIQUE,
+ PRIMARY KEY(c1, c1)
+ ) WITHOUT ROWID;
+ INSERT INTO t0(c0,c1) VALUES('abc','xyz');
+ CREATE TABLE t1(
+ c0,
+ c1 UNIQUE,
+ PRIMARY KEY(c1, c1)
+ ) WITHOUT ROWID;
+ INSERT INTO t1 SELECT * FROM t0;
+ PRAGMA integrity_check;
+ SELECT * FROM t0, t1;
+} {ok abc xyz abc xyz}
finish_test
Index: test/without_rowid6.test
==================================================================
--- test/without_rowid6.test
+++ test/without_rowid6.test
@@ -13,19 +13,26 @@
# has redundant columns.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
+
+proc do_execsql_test_if_vtab {tn sql {res {}}} {
+ ifcapable vtab { uplevel [list do_execsql_test $tn $sql $res] }
+}
do_execsql_test without_rowid6-100 {
CREATE TABLE t1(a,b,c,d,e, PRIMARY KEY(a,b,c,a,b,c,d,a,b,c)) WITHOUT ROWID;
CREATE INDEX t1a ON t1(b, b);
WITH RECURSIVE
c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<1000)
INSERT INTO t1(a,b,c,d,e) SELECT i, i+1000, printf('x%dy',i), 0, 0 FROM c;
ANALYZE;
} {}
+do_execsql_test_if_vtab without_rowid6-101 {
+ SELECT name, key FROM pragma_index_xinfo('t1');
+} {a 1 b 1 c 1 d 1 e 0}
do_execsql_test without_rowid6-110 {
SELECT c FROM t1 WHERE a=123;
} {x123y}
do_execsql_test without_rowid6-120 {
SELECT c FROM t1 WHERE b=1123;
@@ -49,10 +56,13 @@
PRIMARY KEY(b)
) WITHOUT ROWID;
INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9);
SELECT a FROM t1 WHERE b>3 ORDER BY b;
} {4 1}
+do_execsql_test_if_vtab without_rowid6-201 {
+ SELECT name, key FROM pragma_index_xinfo('t1');
+} {b 1 a 0 c 0}
do_execsql_test without_rowid6-210 {
EXPLAIN QUERY PLAN
SELECT a FROM t1 WHERE b>3 ORDER BY b;
} {/SEARCH TABLE t1 USING PRIMARY KEY .b>../}
do_execsql_test without_rowid6-220 {
@@ -103,10 +113,13 @@
PRIMARY KEY(b,c)
) WITHOUT ROWID;
INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9);
SELECT a FROM t1 WHERE b>3 ORDER BY b;
} {4 1}
+do_execsql_test_if_vtab without_rowid6-501 {
+ SELECT name, key FROM pragma_index_xinfo('t1');
+} {b 1 c 1 a 0}
do_execsql_test without_rowid6-510 {
EXPLAIN QUERY PLAN
SELECT a FROM t1 WHERE b>3 ORDER BY b;
} {/SEARCH TABLE t1 USING PRIMARY KEY .b>../}
do_execsql_test without_rowid6-520 {
ADDED test/without_rowid7.test
Index: test/without_rowid7.test
==================================================================
--- /dev/null
+++ test/without_rowid7.test
@@ -0,0 +1,60 @@
+# 2019 July 17
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#*************************************************************************
+# This file implements regression tests for SQLite library.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix without_rowid7
+
+proc do_execsql_test_if_vtab {tn sql {res {}}} {
+ ifcapable vtab { uplevel [list do_execsql_test $tn $sql $res] }
+}
+
+do_execsql_test 1.0 {
+ CREATE TABLE t1(a, b COLLATE nocase, PRIMARY KEY(a, a, b)) WITHOUT ROWID;
+}
+
+do_catchsql_test 1.1 {
+ INSERT INTO t1 VALUES(1, 'one'), (1, 'ONE');
+} {1 {UNIQUE constraint failed: t1.a, t1.b}}
+
+
+do_execsql_test 2.0 {
+ CREATE TABLE t2(a, b, PRIMARY KEY(a COLLATE nocase, a)) WITHOUT ROWID;
+}
+
+do_execsql_test 2.1 {
+ INSERT INTO t2 VALUES(1, 'one');
+ SELECT b FROM t2;
+} {one}
+
+do_execsql_test 2.2a {
+ PRAGMA index_info(t2);
+} {0 0 a 1 0 a}
+do_execsql_test_if_vtab 2.2b {
+ SELECT *, '|' FROM pragma_index_info('t2');
+} {0 0 a | 1 0 a |}
+do_execsql_test 2.3a {
+ PRAGMA index_xinfo(t2);
+} {0 0 a 0 nocase 1 1 0 a 0 BINARY 1 2 1 b 0 BINARY 0}
+do_execsql_test_if_vtab 2.3b {
+ SELECT *, '|' FROM pragma_index_xinfo('t2');
+} {0 0 a 0 nocase 1 | 1 0 a 0 BINARY 1 | 2 1 b 0 BINARY 0 |}
+
+do_execsql_test 2.4 {
+ CREATE TABLE t3(a, b, PRIMARY KEY(a COLLATE nocase, a));
+ PRAGMA index_info(t3);
+} {}
+
+
+
+finish_test
Index: tool/GetFile.cs
==================================================================
--- tool/GetFile.cs
+++ tool/GetFile.cs
@@ -165,11 +165,12 @@
Console.WriteLine(message);
string fileName = Path.GetFileName(
Process.GetCurrentProcess().MainModule.FileName);
- Console.WriteLine(String.Format("usage: {0} ", fileName));
+ Console.WriteLine(String.Format(
+ "usage: {0} [fileName]", fileName));
}
///////////////////////////////////////////////////////////////////////
///
@@ -334,11 +335,11 @@
{
Error(null, true);
return (int)ExitCode.MissingArgs;
}
- if (args.Length != 1)
+ if ((args.Length < 1) || (args.Length > 2))
{
Error(null, true);
return (int)ExitCode.WrongNumArgs;
}
@@ -353,19 +354,30 @@
Error("Could not create absolute URI from argument.", false);
return (int)ExitCode.BadUri;
}
//
- // NOTE: Attempt to extract the file name portion of the URI we
- // just created.
+ // NOTE: If a file name was specified on the command line, try to
+ // use it (without its directory name); otherwise, fallback
+ // to using the file name portion of the URI.
//
- string fileName = GetFileName(uri);
+ string fileName = (args.Length == 2) ?
+ Path.GetFileName(args[1]) : null;
- if (fileName == null)
+ if (String.IsNullOrEmpty(fileName))
{
- Error("Could not extract the file name from the URI.", false);
- return (int)ExitCode.BadFileName;
+ //
+ // NOTE: Attempt to extract the file name portion of the URI
+ // we just created.
+ //
+ fileName = GetFileName(uri);
+
+ if (fileName == null)
+ {
+ Error("Could not extract file name from URI.", false);
+ return (int)ExitCode.BadFileName;
+ }
}
//
// NOTE: Grab the temporary path setup for this process. If it is
// unavailable, we will not continue.
@@ -379,10 +391,19 @@
return (int)ExitCode.BadTempPath;
}
try
{
+ //
+ // HACK: For use of the TLS 1.2 security protocol because some
+ // web servers fail without it. In order to support the
+ // .NET Framework 2.0+ at compilation time, must use its
+ // integer constant here.
+ //
+ ServicePointManager.SecurityProtocol =
+ (SecurityProtocolType)0xC00;
+
using (WebClient webClient = new WebClient())
{
//
// NOTE: Create the event used to signal completion of the
// file download.
Index: tool/dbhash.c
==================================================================
--- tool/dbhash.c
+++ tool/dbhash.c
@@ -60,28 +60,13 @@
* blk0() and blk() perform the initial expand.
* I got the idea of expanding during the round function from SSLeay
*
* blk0le() for little-endian and blk0be() for big-endian.
*/
-#if __GNUC__ && (defined(__i386__) || defined(__x86_64__))
-/*
- * GCC by itself only generates left rotates. Use right rotates if
- * possible to be kinder to dinky implementations with iterative rotate
- * instructions.
- */
-#define SHA_ROT(op, x, k) \
- ({ unsigned int y; asm(op " %1,%0" : "=r" (y) : "I" (k), "0" (x)); y; })
-#define rol(x,k) SHA_ROT("roll", x, k)
-#define ror(x,k) SHA_ROT("rorl", x, k)
-
-#else
-/* Generic C equivalent */
#define SHA_ROT(x,l,r) ((x) << (l) | (x) >> (r))
#define rol(x,k) SHA_ROT(x,k,32-(k))
#define ror(x,k) SHA_ROT(x,32-(k),k)
-#endif
-
#define blk0le(i) (block[i] = (ror(block[i],8)&0xFF00FF00) \
|(rol(block[i],8)&0x00FF00FF))
#define blk0be(i) block[i]
#define blk(i) (block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15] \
Index: tool/lemon.c
==================================================================
--- tool/lemon.c
+++ tool/lemon.c
@@ -216,11 +216,11 @@
void Plink_delete(struct plink *);
/********** From the file "report.h" *************************************/
void Reprint(struct lemon *);
void ReportOutput(struct lemon *);
-void ReportTable(struct lemon *, int);
+void ReportTable(struct lemon *, int, int);
void ReportHeader(struct lemon *);
void CompressTables(struct lemon *);
void ResortStates(struct lemon *);
/********** From the file "set.h" ****************************************/
@@ -482,26 +482,26 @@
** Routines processing parser actions in the LEMON parser generator.
*/
/* Allocate a new parser action */
static struct action *Action_new(void){
- static struct action *freelist = 0;
+ static struct action *actionfreelist = 0;
struct action *newaction;
- if( freelist==0 ){
+ if( actionfreelist==0 ){
int i;
int amt = 100;
- freelist = (struct action *)calloc(amt, sizeof(struct action));
- if( freelist==0 ){
+ actionfreelist = (struct action *)calloc(amt, sizeof(struct action));
+ if( actionfreelist==0 ){
fprintf(stderr,"Unable to allocate memory for a new parser action.");
exit(1);
}
- for(i=0; inext;
+ newaction = actionfreelist;
+ actionfreelist = actionfreelist->next;
return newaction;
}
/* Compare two actions for sorting purposes. Return negative, zero, or
** positive if the first action is less than, equal to, or greater than
@@ -1630,10 +1630,11 @@
static int quiet = 0;
static int statistics = 0;
static int mhflag = 0;
static int nolinenosflag = 0;
static int noResort = 0;
+ static int sqlFlag = 0;
static struct s_options options[] = {
{OPT_FLAG, "b", (char*)&basisflag, "Print only the basis in report."},
{OPT_FLAG, "c", (char*)&compress, "Don't compress the action table."},
{OPT_FSTR, "d", (char*)&handle_d_option, "Output directory. Default '.'"},
@@ -1648,10 +1649,12 @@
"Show conflicts resolved by precedence rules"},
{OPT_FLAG, "q", (char*)&quiet, "(Quiet) Don't print the report file."},
{OPT_FLAG, "r", (char*)&noResort, "Do not sort or renumber states"},
{OPT_FLAG, "s", (char*)&statistics,
"Print parser stats to standard output."},
+ {OPT_FLAG, "S", (char*)&sqlFlag,
+ "Generate the *.sql file describing the parser tables."},
{OPT_FLAG, "x", (char*)&version, "Print the version number."},
{OPT_FSTR, "T", (char*)handle_T_option, "Specify a template file."},
{OPT_FSTR, "W", 0, "Ignored. (Placeholder for '-W' compiler options.)"},
{OPT_FLAG,0,0,0}
};
@@ -1756,11 +1759,11 @@
/* Generate a report of the parser generated. (the "y.output" file) */
if( !quiet ) ReportOutput(&lem);
/* Generate the source code for the parser */
- ReportTable(&lem, mhflag);
+ ReportTable(&lem, mhflag, sqlFlag);
/* Produce a header file for use by the scanner. (This step is
** omitted if the "-m" option is used because makeheaders will
** generate the file for us.) */
if( !mhflag ) ReportHeader(&lem);
@@ -1906,11 +1909,11 @@
ep = 0;
for(i=0; i0 ){
@@ -2110,24 +2113,24 @@
int OptNArgs(void){
int cnt = 0;
int dashdash = 0;
int i;
- if( argv!=0 && argv[0]!=0 ){
- for(i=1; argv[i]; i++){
- if( dashdash || !ISOPT(argv[i]) ) cnt++;
- if( strcmp(argv[i],"--")==0 ) dashdash = 1;
+ if( g_argv!=0 && g_argv[0]!=0 ){
+ for(i=1; g_argv[i]; i++){
+ if( dashdash || !ISOPT(g_argv[i]) ) cnt++;
+ if( strcmp(g_argv[i],"--")==0 ) dashdash = 1;
}
}
return cnt;
}
char *OptArg(int n)
{
int i;
i = argindex(n);
- return i>=0 ? argv[i] : 0;
+ return i>=0 ? g_argv[i] : 0;
}
void OptErr(int n)
{
int i;
@@ -2727,11 +2730,11 @@
}
break;
case WAITING_FOR_CLASS_ID:
if( !ISLOWER(x[0]) ){
ErrorMsg(psp->filename, psp->tokenlineno,
- "%%token_class must be followed by an identifier: ", x);
+ "%%token_class must be followed by an identifier: %s", x);
psp->errorcnt++;
psp->state = RESYNC_AFTER_DECL_ERROR;
}else if( Symbol_find(x) ){
ErrorMsg(psp->filename, psp->tokenlineno,
"Symbol \"%s\" already used", x);
@@ -3847,11 +3850,11 @@
int j;
if( rp->lhsalias && strcmp(rp->lhsalias,rp->rhsalias[i])==0 ){
ErrorMsg(lemp->filename,rp->ruleline,
"%s(%s) has the same label as the LHS but is not the left-most "
"symbol on the RHS.",
- rp->rhs[i]->name, rp->rhsalias);
+ rp->rhs[i]->name, rp->rhsalias[i]);
lemp->errorcnt++;
}
for(j=0; jrhsalias[j] && strcmp(rp->rhsalias[j],rp->rhsalias[i])==0 ){
ErrorMsg(lemp->filename,rp->ruleline,
@@ -4141,20 +4144,22 @@
/* Generate C source code for the parser */
void ReportTable(
struct lemon *lemp,
- int mhflag /* Output in makeheaders format if true */
+ int mhflag, /* Output in makeheaders format if true */
+ int sqlFlag /* Generate the *.sql file too */
){
- FILE *out, *in;
+ FILE *out, *in, *sql;
char line[LINESIZE];
int lineno;
struct state *stp;
struct action *ap;
struct rule *rp;
struct acttab *pActtab;
int i, j, n, sz;
+ int nLookAhead;
int szActionType; /* sizeof(YYACTIONTYPE) */
int szCodeType; /* sizeof(YYCODETYPE) */
const char *name;
int mnTknOfst, mxTknOfst;
int mnNtOfst, mxNtOfst;
@@ -4172,10 +4177,82 @@
out = file_open(lemp,".c","wb");
if( out==0 ){
fclose(in);
return;
}
+ if( sqlFlag==0 ){
+ sql = 0;
+ }else{
+ sql = file_open(lemp, ".sql", "wb");
+ if( sql==0 ){
+ fclose(in);
+ fclose(out);
+ return;
+ }
+ fprintf(sql,
+ "BEGIN;\n"
+ "CREATE TABLE symbol(\n"
+ " id INTEGER PRIMARY KEY,\n"
+ " name TEXT NOT NULL,\n"
+ " isTerminal BOOLEAN NOT NULL,\n"
+ " fallback INTEGER REFERENCES symbol"
+ " DEFERRABLE INITIALLY DEFERRED\n"
+ ");\n"
+ );
+ for(i=0; insymbol; i++){
+ fprintf(sql,
+ "INSERT INTO symbol(id,name,isTerminal,fallback)"
+ "VALUES(%d,'%s',%s",
+ i, lemp->symbols[i]->name,
+ interminal ? "TRUE" : "FALSE"
+ );
+ if( lemp->symbols[i]->fallback ){
+ fprintf(sql, ",%d);\n", lemp->symbols[i]->fallback->index);
+ }else{
+ fprintf(sql, ",NULL);\n");
+ }
+ }
+ fprintf(sql,
+ "CREATE TABLE rule(\n"
+ " ruleid INTEGER PRIMARY KEY,\n"
+ " lhs INTEGER REFERENCES symbol(id)\n"
+ ");\n"
+ "CREATE TABLE rulerhs(\n"
+ " ruleid INTEGER REFERENCES rule(ruleid),\n"
+ " pos INTEGER,\n"
+ " sym INTEGER REFERENCES symbol(id)\n"
+ ");\n"
+ );
+ for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){
+ assert( i==rp->iRule );
+ fprintf(sql, "-- ");
+ writeRuleText(sql, rp);
+ fprintf(sql, "\n");
+ fprintf(sql,
+ "INSERT INTO rule(ruleid,lhs)VALUES(%d,%d);\n",
+ rp->iRule, rp->lhs->index
+ );
+ for(j=0; jnrhs; j++){
+ struct symbol *sp = rp->rhs[j];
+ if( sp->type!=MULTITERMINAL ){
+ fprintf(sql,
+ "INSERT INTO rulerhs(ruleid,pos,sym)VALUES(%d,%d,%d);\n",
+ i,j,sp->index
+ );
+ }else{
+ int k;
+ for(k=0; knsubsym; k++){
+ fprintf(sql,
+ "INSERT INTO rulerhs(ruleid,pos,sym)VALUES(%d,%d,%d);\n",
+ i,j,sp->subsym[k]->index
+ );
+ }
+ }
+ }
+ }
+ fprintf(sql, "COMMIT;\n");
+ }
lineno = 1;
tplt_xfer(lemp->name,in,out,&lineno);
/* Generate the include code, if any */
tplt_print(out,lemp,lemp->include,&lineno);
@@ -4401,17 +4478,33 @@
for(i=j=0; insymbol;
if( j==0 ) fprintf(out," /* %5d */ ", i);
fprintf(out, " %4d,", la);
- if( j==9 || i==n-1 ){
+ if( j==9 ){
+ fprintf(out, "\n"); lineno++;
+ j = 0;
+ }else{
+ j++;
+ }
+ }
+ /* Add extra entries to the end of the yy_lookahead[] table so that
+ ** yy_shift_ofst[]+iToken will always be a valid index into the array,
+ ** even for the largest possible value of yy_shift_ofst[] and iToken. */
+ nLookAhead = lemp->nterminal + lemp->nactiontab;
+ while( interminal);
+ if( j==9 ){
fprintf(out, "\n"); lineno++;
j = 0;
}else{
j++;
}
+ i++;
}
+ if( j>0 ){ fprintf(out, "\n"); lineno++; }
fprintf(out, "};\n"); lineno++;
/* Output the yy_shift_ofst[] table */
n = lemp->nxstate;
while( n>0 && lemp->sorted[n-1]->iTknOfst==NO_OFFSET ) n--;
@@ -4487,11 +4580,13 @@
/* Generate the table of fallback tokens.
*/
if( lemp->has_fallback ){
int mx = lemp->nterminal - 1;
- while( mx>0 && lemp->symbols[mx]->fallback==0 ){ mx--; }
+ /* 2019-08-28: Generate fallback entries for every token to avoid
+ ** having to do a range check on the index */
+ /* while( mx>0 && lemp->symbols[mx]->fallback==0 ){ mx--; } */
lemp->tablesize += (mx+1)*szCodeType;
for(i=0; i<=mx; i++){
struct symbol *p = lemp->symbols[i];
if( p->fallback==0 ){
fprintf(out, " 0, /* %10s => nothing */\n", p->name);
@@ -4676,10 +4771,11 @@
tplt_print(out,lemp,lemp->extracode,&lineno);
acttab_free(pActtab);
fclose(in);
fclose(out);
+ if( sql ) fclose(sql);
return;
}
/* Generate a header file for the parser */
void ReportHeader(struct lemon *lemp)
Index: tool/lempar.c
==================================================================
--- tool/lempar.c
+++ tool/lempar.c
@@ -519,19 +519,22 @@
yycoverage[stateno][iLookAhead] = 1;
#endif
do{
i = yy_shift_ofst[stateno];
assert( i>=0 );
- /* assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); */
+ assert( i<=YY_ACTTAB_COUNT );
+ assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD );
assert( iLookAhead!=YYNOCODE );
assert( iLookAhead < YYNTOKEN );
i += iLookAhead;
- if( i>=YY_NLOOKAHEAD || yy_lookahead[i]!=iLookAhead ){
+ assert( i<(int)YY_NLOOKAHEAD );
+ if( yy_lookahead[i]!=iLookAhead ){
#ifdef YYFALLBACK
YYCODETYPE iFallback; /* Fallback token */
- if( iLookAhead %s\n",
yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]);
}
@@ -542,20 +545,12 @@
}
#endif
#ifdef YYWILDCARD
{
int j = i - iLookAhead + YYWILDCARD;
- if(
-#if YY_SHIFT_MIN+YYWILDCARD<0
- j>=0 &&
-#endif
-#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT
- j0
- ){
+ assert( j<(int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])) );
+ if( yy_lookahead[j]==YYWILDCARD && iLookAhead>0 ){
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n",
yyTracePrompt, yyTokenName[iLookAhead],
yyTokenName[YYWILDCARD]);
@@ -565,10 +560,11 @@
}
}
#endif /* YYWILDCARD */
return yy_default[stateno];
}else{
+ assert( i>=0 && i= aKeywordTable[j].priority ) return;
+ aKeywordTable[i].iNext = aKeywordTable[j].iNext;
+ aKeywordTable[j].iNext = i+1;
+ *pFrom = j+1;
+ reorder(&aKeywordTable[i].iNext);
+}
/*
** This routine does the work. The generated code is printed on standard
** output.
*/
@@ -484,10 +513,11 @@
for(i=0; i> (r))
#define rol(x,k) SHA_ROT(x,k,32-(k))
#define ror(x,k) SHA_ROT(x,32-(k),k)
-#endif
-
-
-
-
#define blk0le(i) (block[i] = (ror(block[i],8)&0xFF00FF00) \
|(rol(block[i],8)&0x00FF00FF))
#define blk0be(i) block[i]
#define blk(i) (block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15] \
Index: tool/showdb.c
==================================================================
--- tool/showdb.c
+++ tool/showdb.c
@@ -833,13 +833,24 @@
sqlite3_free(a);
}
}
}
+/*
+** True if the memory is all zeros
+*/
+static int allZero(unsigned char *a, int n){
+ while( n && (a++)[0]==0 ){ n--; }
+ return n==0;
+}
+
/*
-** Describe the usages of a b-tree page
+** Describe the usages of a b-tree page.
+**
+** If parent==0, then this is the root of a btree. If parent<0 then
+** this is an orphan page.
*/
static void page_usage_btree(
int pgno, /* Page to describe */
int parent, /* Parent of this page. 0 for root pages */
int idx, /* Which child of the parent */
@@ -848,26 +859,48 @@
unsigned char *a;
const char *zType = "corrupt node";
int nCell;
int i;
int hdr = pgno==1 ? 100 : 0;
+ char zEntry[30];
if( pgno<=0 || pgno>g.mxPage ) return;
a = fileRead((pgno-1)*g.pagesize, g.pagesize);
switch( a[hdr] ){
+ case 0: {
+ if( allZero(a, g.pagesize) ){
+ zType = "zeroed page";
+ }else if( parent<0 ){
+ return;
+ }else{
+ zType = "corrupt node";
+ }
+ break;
+ }
case 2: zType = "interior node of index"; break;
case 5: zType = "interior node of table"; break;
case 10: zType = "leaf of index"; break;
case 13: zType = "leaf of table"; break;
- }
- if( parent ){
- page_usage_msg(pgno, "%s [%s], child %d of page %d",
- zType, zName, idx, parent);
- }else{
- page_usage_msg(pgno, "root %s [%s]", zType, zName);
+ default: {
+ if( parent<0 ) return;
+ zType = "corrupt node";
+ }
}
nCell = a[hdr+3]*256 + a[hdr+4];
+ if( nCell==1 ){
+ sqlite3_snprintf(sizeof(zEntry),zEntry,"1 row");
+ }else{
+ sqlite3_snprintf(sizeof(zEntry),zEntry,"%d rows", nCell);
+ }
+ if( parent>0 ){
+ page_usage_msg(pgno, "%s [%s], child %d of page %d, %s",
+ zType, zName, idx, parent, zEntry);
+ }else if( parent==0 ){
+ page_usage_msg(pgno, "root %s [%s], %s", zType, zName, zEntry);
+ }else{
+ page_usage_msg(pgno, "orphaned %s, %s", zType, zEntry);
+ }
if( a[hdr]==2 || a[hdr]==5 ){
int cellstart = hdr+12;
unsigned int child;
for(i=0; i |