Fossil SCM

Merged in trunk.

stephan 2020-05-17 17:07 fileedit-ajaxify merge
Commit b9b746e50f27b912b6444f2017549e40b288ff360fb7174b7f91f1ead6eea191
--- skins/default/header.txt
+++ skins/default/header.txt
@@ -17,17 +17,18 @@
1717
html "<a href='$home$url' class='active $cls'>$name</a>\n"
1818
} else {
1919
html "<a href='$home$url' class='$cls'>$name</a>\n"
2020
}
2121
}
22
-html "<a id='hbbtn' href='$home/sitemap'>&#9776;</a>"
22
+html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>&#9776;</a>"
2323
menulink $index_page Home {}
2424
if {[anycap jor]} {
2525
menulink /timeline Timeline {}
2626
}
2727
if {[hascap oh]} {
28
- menulink /dir?ci=tip Files desktoponly
28
+ if {![info exists current_checkin]} {set current_checkin tip}
29
+ menulink /dir?ci=$current_checkin Files desktoponly
2930
}
3031
if {[hascap o]} {
3132
menulink /brlist Branches desktoponly
3233
menulink /taglist Tags wideonly
3334
}
3435
--- skins/default/header.txt
+++ skins/default/header.txt
@@ -17,17 +17,18 @@
17 html "<a href='$home$url' class='active $cls'>$name</a>\n"
18 } else {
19 html "<a href='$home$url' class='$cls'>$name</a>\n"
20 }
21 }
22 html "<a id='hbbtn' href='$home/sitemap'>&#9776;</a>"
23 menulink $index_page Home {}
24 if {[anycap jor]} {
25 menulink /timeline Timeline {}
26 }
27 if {[hascap oh]} {
28 menulink /dir?ci=tip Files desktoponly
 
29 }
30 if {[hascap o]} {
31 menulink /brlist Branches desktoponly
32 menulink /taglist Tags wideonly
33 }
34
--- skins/default/header.txt
+++ skins/default/header.txt
@@ -17,17 +17,18 @@
17 html "<a href='$home$url' class='active $cls'>$name</a>\n"
18 } else {
19 html "<a href='$home$url' class='$cls'>$name</a>\n"
20 }
21 }
22 html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>&#9776;</a>"
23 menulink $index_page Home {}
24 if {[anycap jor]} {
25 menulink /timeline Timeline {}
26 }
27 if {[hascap oh]} {
28 if {![info exists current_checkin]} {set current_checkin tip}
29 menulink /dir?ci=$current_checkin Files desktoponly
30 }
31 if {[hascap o]} {
32 menulink /brlist Branches desktoponly
33 menulink /taglist Tags wideonly
34 }
35
--- src/allrepo.c
+++ src/allrepo.c
@@ -283,11 +283,13 @@
283283
}else if( strncmp(zCmd, "sync", n)==0 ){
284284
zCmd = "sync -autourl -R";
285285
collect_argument(&extra, "verbose","v");
286286
collect_argument(&extra, "unversioned","u");
287287
}else if( strncmp(zCmd, "test-integrity", n)==0 ){
288
+ collect_argument(&extra, "db-only", "d");
288289
collect_argument(&extra, "parse", 0);
290
+ collect_argument(&extra, "quick", "q");
289291
zCmd = "test-integrity";
290292
}else if( strncmp(zCmd, "test-orphans", n)==0 ){
291293
zCmd = "test-orphans -R";
292294
}else if( strncmp(zCmd, "test-missing", n)==0 ){
293295
zCmd = "test-missing -q -R";
294296
--- src/allrepo.c
+++ src/allrepo.c
@@ -283,11 +283,13 @@
283 }else if( strncmp(zCmd, "sync", n)==0 ){
284 zCmd = "sync -autourl -R";
285 collect_argument(&extra, "verbose","v");
286 collect_argument(&extra, "unversioned","u");
287 }else if( strncmp(zCmd, "test-integrity", n)==0 ){
 
288 collect_argument(&extra, "parse", 0);
 
289 zCmd = "test-integrity";
290 }else if( strncmp(zCmd, "test-orphans", n)==0 ){
291 zCmd = "test-orphans -R";
292 }else if( strncmp(zCmd, "test-missing", n)==0 ){
293 zCmd = "test-missing -q -R";
294
--- src/allrepo.c
+++ src/allrepo.c
@@ -283,11 +283,13 @@
283 }else if( strncmp(zCmd, "sync", n)==0 ){
284 zCmd = "sync -autourl -R";
285 collect_argument(&extra, "verbose","v");
286 collect_argument(&extra, "unversioned","u");
287 }else if( strncmp(zCmd, "test-integrity", n)==0 ){
288 collect_argument(&extra, "db-only", "d");
289 collect_argument(&extra, "parse", 0);
290 collect_argument(&extra, "quick", "q");
291 zCmd = "test-integrity";
292 }else if( strncmp(zCmd, "test-orphans", n)==0 ){
293 zCmd = "test-orphans -R";
294 }else if( strncmp(zCmd, "test-missing", n)==0 ){
295 zCmd = "test-missing -q -R";
296
--- src/browse.c
+++ src/browse.c
@@ -173,10 +173,11 @@
173173
linkTrunk = trunkRid && rid != trunkRid;
174174
linkTip = rid != symbolic_name_to_rid("tip", "ci");
175175
zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
176176
isSymbolicCI = (sqlite3_strnicmp(zUuid, zCI, strlen(zCI))!=0);
177177
isBranchCI = branch_includes_uuid(zCI, zUuid);
178
+ Th_Store("current_checkin", zCI);
178179
}else{
179180
zCI = 0;
180181
}
181182
}
182183
@@ -701,10 +702,11 @@
701702
rNow = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
702703
zNow = db_text("", "SELECT datetime(mtime,toLocal())"
703704
" FROM event WHERE objid=%d", rid);
704705
isSymbolicCI = (sqlite3_strnicmp(zUuid, zCI, strlen(zCI)) != 0);
705706
isBranchCI = branch_includes_uuid(zCI, zUuid);
707
+ Th_Store("current_checkin", zCI);
706708
}else{
707709
zCI = 0;
708710
}
709711
}
710712
if( zCI==0 ){
711713
--- src/browse.c
+++ src/browse.c
@@ -173,10 +173,11 @@
173 linkTrunk = trunkRid && rid != trunkRid;
174 linkTip = rid != symbolic_name_to_rid("tip", "ci");
175 zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
176 isSymbolicCI = (sqlite3_strnicmp(zUuid, zCI, strlen(zCI))!=0);
177 isBranchCI = branch_includes_uuid(zCI, zUuid);
 
178 }else{
179 zCI = 0;
180 }
181 }
182
@@ -701,10 +702,11 @@
701 rNow = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
702 zNow = db_text("", "SELECT datetime(mtime,toLocal())"
703 " FROM event WHERE objid=%d", rid);
704 isSymbolicCI = (sqlite3_strnicmp(zUuid, zCI, strlen(zCI)) != 0);
705 isBranchCI = branch_includes_uuid(zCI, zUuid);
 
706 }else{
707 zCI = 0;
708 }
709 }
710 if( zCI==0 ){
711
--- src/browse.c
+++ src/browse.c
@@ -173,10 +173,11 @@
173 linkTrunk = trunkRid && rid != trunkRid;
174 linkTip = rid != symbolic_name_to_rid("tip", "ci");
175 zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
176 isSymbolicCI = (sqlite3_strnicmp(zUuid, zCI, strlen(zCI))!=0);
177 isBranchCI = branch_includes_uuid(zCI, zUuid);
178 Th_Store("current_checkin", zCI);
179 }else{
180 zCI = 0;
181 }
182 }
183
@@ -701,10 +702,11 @@
702 rNow = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
703 zNow = db_text("", "SELECT datetime(mtime,toLocal())"
704 " FROM event WHERE objid=%d", rid);
705 isSymbolicCI = (sqlite3_strnicmp(zUuid, zCI, strlen(zCI)) != 0);
706 isBranchCI = branch_includes_uuid(zCI, zUuid);
707 Th_Store("current_checkin", zCI);
708 }else{
709 zCI = 0;
710 }
711 }
712 if( zCI==0 ){
713
--- src/capabilities.c
+++ src/capabilities.c
@@ -239,11 +239,11 @@
239239
char *zOneLiner; /* One-line summary */
240240
} aCap[] = {
241241
{ 'a', CAPCLASS_SUPER, 0,
242242
"Admin", "Create and delete users" },
243243
{ 'b', CAPCLASS_WIKI|CAPCLASS_TKT, 0,
244
- "Attach", "Add attchments to wiki or tickets" },
244
+ "Attach", "Add attachments to wiki or tickets" },
245245
{ 'c', CAPCLASS_TKT, 0,
246246
"Append-Tkt", "Append to existing tickets" },
247247
/*
248248
** d unused since fork from CVSTrac;
249249
** see https://fossil-scm.org/forum/forumpost/43c78f4bef
250250
--- src/capabilities.c
+++ src/capabilities.c
@@ -239,11 +239,11 @@
239 char *zOneLiner; /* One-line summary */
240 } aCap[] = {
241 { 'a', CAPCLASS_SUPER, 0,
242 "Admin", "Create and delete users" },
243 { 'b', CAPCLASS_WIKI|CAPCLASS_TKT, 0,
244 "Attach", "Add attchments to wiki or tickets" },
245 { 'c', CAPCLASS_TKT, 0,
246 "Append-Tkt", "Append to existing tickets" },
247 /*
248 ** d unused since fork from CVSTrac;
249 ** see https://fossil-scm.org/forum/forumpost/43c78f4bef
250
--- src/capabilities.c
+++ src/capabilities.c
@@ -239,11 +239,11 @@
239 char *zOneLiner; /* One-line summary */
240 } aCap[] = {
241 { 'a', CAPCLASS_SUPER, 0,
242 "Admin", "Create and delete users" },
243 { 'b', CAPCLASS_WIKI|CAPCLASS_TKT, 0,
244 "Attach", "Add attachments to wiki or tickets" },
245 { 'c', CAPCLASS_TKT, 0,
246 "Append-Tkt", "Append to existing tickets" },
247 /*
248 ** d unused since fork from CVSTrac;
249 ** see https://fossil-scm.org/forum/forumpost/43c78f4bef
250
+2 -1
--- src/captcha.c
+++ src/captcha.c
@@ -558,11 +558,12 @@
558558
/*
559559
** Add a "Speak the captcha" button.
560560
*/
561561
void captcha_speakit_button(unsigned int uSeed, const char *zMsg){
562562
if( zMsg==0 ) zMsg = "Speak the text";
563
- @ <input type="button" value="%h(zMsg)" id="speakthetext">
563
+ @ <input aria-label="%h(zMsg)" type="button" value="%h(zMsg)" \
564
+ @ id="speakthetext">
564565
@ <script nonce="%h(style_nonce())">
565566
@ document.getElementById("speakthetext").onclick = function(){
566567
@ var audio = window.fossilAudioCaptcha \
567568
@ || new Audio("%R/captcha-audio/%u(uSeed)");
568569
@ window.fossilAudioCaptcha = audio;
569570
--- src/captcha.c
+++ src/captcha.c
@@ -558,11 +558,12 @@
558 /*
559 ** Add a "Speak the captcha" button.
560 */
561 void captcha_speakit_button(unsigned int uSeed, const char *zMsg){
562 if( zMsg==0 ) zMsg = "Speak the text";
563 @ <input type="button" value="%h(zMsg)" id="speakthetext">
 
564 @ <script nonce="%h(style_nonce())">
565 @ document.getElementById("speakthetext").onclick = function(){
566 @ var audio = window.fossilAudioCaptcha \
567 @ || new Audio("%R/captcha-audio/%u(uSeed)");
568 @ window.fossilAudioCaptcha = audio;
569
--- src/captcha.c
+++ src/captcha.c
@@ -558,11 +558,12 @@
558 /*
559 ** Add a "Speak the captcha" button.
560 */
561 void captcha_speakit_button(unsigned int uSeed, const char *zMsg){
562 if( zMsg==0 ) zMsg = "Speak the text";
563 @ <input aria-label="%h(zMsg)" type="button" value="%h(zMsg)" \
564 @ id="speakthetext">
565 @ <script nonce="%h(style_nonce())">
566 @ document.getElementById("speakthetext").onclick = function(){
567 @ var audio = window.fossilAudioCaptcha \
568 @ || new Audio("%R/captcha-audio/%u(uSeed)");
569 @ window.fossilAudioCaptcha = audio;
570
--- src/content.c
+++ src/content.c
@@ -944,13 +944,19 @@
944944
** Verify that all content can be extracted from the BLOB table correctly.
945945
** If the BLOB table is correct, then the repository can always be
946946
** successfully reconstructed using "fossil rebuild".
947947
**
948948
** Options:
949
+**
950
+** -d|--db-only Run "PRAGMA integrity_check" on the database only.
951
+** No other validation is performed.
949952
**
950953
** --parse Parse all manifests, wikis, tickets, events, and
951954
** so forth, reporting any errors found.
955
+**
956
+** -q|--quick Run "PRAGMA quick_check" on the database only.
957
+** No other validation is performed.
952958
*/
953959
void test_integrity(void){
954960
Stmt q;
955961
Blob content;
956962
int n1 = 0;
@@ -958,11 +964,25 @@
958964
int nErr = 0;
959965
int total;
960966
int nCA = 0;
961967
int anCA[10];
962968
int bParse = find_option("parse",0,0)!=0;
969
+ int bDbOnly = find_option("db-only","d",0)!=0;
970
+ int bQuick = find_option("quick","q",0)!=0;
963971
db_find_and_open_repository(OPEN_ANY_SCHEMA, 2);
972
+ if( bDbOnly || bQuick ){
973
+ const char *zType = bQuick ? "quick" : "integrity";
974
+ char *zRes;
975
+ zRes = db_text(0,"PRAGMA repository.%s_check", zType/*safe-for-%s*/);
976
+ if( fossil_strcmp(zRes,"ok")!=0 ){
977
+ fossil_print("%s_check failed!\n", zType);
978
+ exit(1);
979
+ }else{
980
+ fossil_print("ok\n");
981
+ }
982
+ return;
983
+ }
964984
memset(anCA, 0, sizeof(anCA));
965985
966986
/* Make sure no public artifact is a delta from a private artifact */
967987
db_prepare(&q,
968988
"SELECT "
969989
--- src/content.c
+++ src/content.c
@@ -944,13 +944,19 @@
944 ** Verify that all content can be extracted from the BLOB table correctly.
945 ** If the BLOB table is correct, then the repository can always be
946 ** successfully reconstructed using "fossil rebuild".
947 **
948 ** Options:
 
 
 
949 **
950 ** --parse Parse all manifests, wikis, tickets, events, and
951 ** so forth, reporting any errors found.
 
 
 
952 */
953 void test_integrity(void){
954 Stmt q;
955 Blob content;
956 int n1 = 0;
@@ -958,11 +964,25 @@
958 int nErr = 0;
959 int total;
960 int nCA = 0;
961 int anCA[10];
962 int bParse = find_option("parse",0,0)!=0;
 
 
963 db_find_and_open_repository(OPEN_ANY_SCHEMA, 2);
 
 
 
 
 
 
 
 
 
 
 
 
964 memset(anCA, 0, sizeof(anCA));
965
966 /* Make sure no public artifact is a delta from a private artifact */
967 db_prepare(&q,
968 "SELECT "
969
--- src/content.c
+++ src/content.c
@@ -944,13 +944,19 @@
944 ** Verify that all content can be extracted from the BLOB table correctly.
945 ** If the BLOB table is correct, then the repository can always be
946 ** successfully reconstructed using "fossil rebuild".
947 **
948 ** Options:
949 **
950 ** -d|--db-only Run "PRAGMA integrity_check" on the database only.
951 ** No other validation is performed.
952 **
953 ** --parse Parse all manifests, wikis, tickets, events, and
954 ** so forth, reporting any errors found.
955 **
956 ** -q|--quick Run "PRAGMA quick_check" on the database only.
957 ** No other validation is performed.
958 */
959 void test_integrity(void){
960 Stmt q;
961 Blob content;
962 int n1 = 0;
@@ -958,11 +964,25 @@
964 int nErr = 0;
965 int total;
966 int nCA = 0;
967 int anCA[10];
968 int bParse = find_option("parse",0,0)!=0;
969 int bDbOnly = find_option("db-only","d",0)!=0;
970 int bQuick = find_option("quick","q",0)!=0;
971 db_find_and_open_repository(OPEN_ANY_SCHEMA, 2);
972 if( bDbOnly || bQuick ){
973 const char *zType = bQuick ? "quick" : "integrity";
974 char *zRes;
975 zRes = db_text(0,"PRAGMA repository.%s_check", zType/*safe-for-%s*/);
976 if( fossil_strcmp(zRes,"ok")!=0 ){
977 fossil_print("%s_check failed!\n", zType);
978 exit(1);
979 }else{
980 fossil_print("ok\n");
981 }
982 return;
983 }
984 memset(anCA, 0, sizeof(anCA));
985
986 /* Make sure no public artifact is a delta from a private artifact */
987 db_prepare(&q,
988 "SELECT "
989
+1 -1
--- src/doc.c
+++ src/doc.c
@@ -810,11 +810,11 @@
810810
** WEBPAGE: doc
811811
** URL: /uv/FILE
812812
** URL: /doc/CHECKIN/FILE
813813
**
814814
** CHECKIN can be either tag or hash prefix or timestamp identifying a
815
-** particular check, or the name of a branch (meaning the most recent
815
+** particular check-in, or the name of a branch (meaning the most recent
816816
** check-in on that branch) or one of various magic words:
817817
**
818818
** "tip" means the most recent check-in
819819
**
820820
** "ckout" means the current check-out, if the server is run from
821821
--- src/doc.c
+++ src/doc.c
@@ -810,11 +810,11 @@
810 ** WEBPAGE: doc
811 ** URL: /uv/FILE
812 ** URL: /doc/CHECKIN/FILE
813 **
814 ** CHECKIN can be either tag or hash prefix or timestamp identifying a
815 ** particular check, or the name of a branch (meaning the most recent
816 ** check-in on that branch) or one of various magic words:
817 **
818 ** "tip" means the most recent check-in
819 **
820 ** "ckout" means the current check-out, if the server is run from
821
--- src/doc.c
+++ src/doc.c
@@ -810,11 +810,11 @@
810 ** WEBPAGE: doc
811 ** URL: /uv/FILE
812 ** URL: /doc/CHECKIN/FILE
813 **
814 ** CHECKIN can be either tag or hash prefix or timestamp identifying a
815 ** particular check-in, or the name of a branch (meaning the most recent
816 ** check-in on that branch) or one of various magic words:
817 **
818 ** "tip" means the most recent check-in
819 **
820 ** "ckout" means the current check-out, if the server is run from
821
+5 -4
--- src/forum.c
+++ src/forum.c
@@ -1013,12 +1013,12 @@
10131013
@ Title: <input type="input" name="title" value="%h(zTitle)" size="50"
10141014
@ maxlength="125"><br>
10151015
}
10161016
@ %z(href("%R/markup_help"))Markup style</a>:
10171017
mimetype_option_menu(zMimetype);
1018
- @ <br><textarea name="content" class="wikiedit" cols="80" \
1019
- @ rows="25" wrap="virtual">%h(zContent)</textarea><br>
1018
+ @ <br><textarea aria-label="Content:" name="content" class="wikiedit" \
1019
+ @ cols="80" rows="25" wrap="virtual">%h(zContent)</textarea><br>
10201020
}
10211021
10221022
/*
10231023
** WEBPAGE: forumnew
10241024
** WEBPAGE: forumedit
@@ -1119,11 +1119,12 @@
11191119
@ <input type="submit" name="submit" value="Submit">
11201120
}else{
11211121
@ <input type="submit" name="submit" value="Submit" disabled>
11221122
}
11231123
if( g.perm.Debug ){
1124
- /* For the test-forumnew page add these extra debugging controls */
1124
+ /* Give extra control over the post to users with the special
1125
+ * Debug capability, which includes Admin and Setup users */
11251126
@ <div class="debug">
11261127
@ <label><input type="checkbox" name="dryrun" %s(PCK("dryrun"))> \
11271128
@ Dry run</label>
11281129
@ <br><label><input type="checkbox" name="domod" %s(PCK("domod"))> \
11291130
@ Require moderator approval</label>
@@ -1235,11 +1236,11 @@
12351236
@ <input type="hidden" name="fpid" value="%h(P("fpid"))">
12361237
@ <input type="hidden" name="nullout" value="1">
12371238
@ <input type="hidden" name="mimetype" value="%h(zMimetype)">
12381239
@ <input type="hidden" name="content" value="%h(zContent)">
12391240
if( zTitle ){
1240
- @ <input type="hidden" name="title" value="%h(zTitle)">
1241
+ @ <input aria-label="Title" type="hidden" name="title" value="%h(zTitle)">
12411242
}
12421243
}else if( P("edit") ){
12431244
/* Provide an edit to the fpid post */
12441245
zMimetype = P("mimetype");
12451246
zContent = PT("content");
12461247
--- src/forum.c
+++ src/forum.c
@@ -1013,12 +1013,12 @@
1013 @ Title: <input type="input" name="title" value="%h(zTitle)" size="50"
1014 @ maxlength="125"><br>
1015 }
1016 @ %z(href("%R/markup_help"))Markup style</a>:
1017 mimetype_option_menu(zMimetype);
1018 @ <br><textarea name="content" class="wikiedit" cols="80" \
1019 @ rows="25" wrap="virtual">%h(zContent)</textarea><br>
1020 }
1021
1022 /*
1023 ** WEBPAGE: forumnew
1024 ** WEBPAGE: forumedit
@@ -1119,11 +1119,12 @@
1119 @ <input type="submit" name="submit" value="Submit">
1120 }else{
1121 @ <input type="submit" name="submit" value="Submit" disabled>
1122 }
1123 if( g.perm.Debug ){
1124 /* For the test-forumnew page add these extra debugging controls */
 
1125 @ <div class="debug">
1126 @ <label><input type="checkbox" name="dryrun" %s(PCK("dryrun"))> \
1127 @ Dry run</label>
1128 @ <br><label><input type="checkbox" name="domod" %s(PCK("domod"))> \
1129 @ Require moderator approval</label>
@@ -1235,11 +1236,11 @@
1235 @ <input type="hidden" name="fpid" value="%h(P("fpid"))">
1236 @ <input type="hidden" name="nullout" value="1">
1237 @ <input type="hidden" name="mimetype" value="%h(zMimetype)">
1238 @ <input type="hidden" name="content" value="%h(zContent)">
1239 if( zTitle ){
1240 @ <input type="hidden" name="title" value="%h(zTitle)">
1241 }
1242 }else if( P("edit") ){
1243 /* Provide an edit to the fpid post */
1244 zMimetype = P("mimetype");
1245 zContent = PT("content");
1246
--- src/forum.c
+++ src/forum.c
@@ -1013,12 +1013,12 @@
1013 @ Title: <input type="input" name="title" value="%h(zTitle)" size="50"
1014 @ maxlength="125"><br>
1015 }
1016 @ %z(href("%R/markup_help"))Markup style</a>:
1017 mimetype_option_menu(zMimetype);
1018 @ <br><textarea aria-label="Content:" name="content" class="wikiedit" \
1019 @ cols="80" rows="25" wrap="virtual">%h(zContent)</textarea><br>
1020 }
1021
1022 /*
1023 ** WEBPAGE: forumnew
1024 ** WEBPAGE: forumedit
@@ -1119,11 +1119,12 @@
1119 @ <input type="submit" name="submit" value="Submit">
1120 }else{
1121 @ <input type="submit" name="submit" value="Submit" disabled>
1122 }
1123 if( g.perm.Debug ){
1124 /* Give extra control over the post to users with the special
1125 * Debug capability, which includes Admin and Setup users */
1126 @ <div class="debug">
1127 @ <label><input type="checkbox" name="dryrun" %s(PCK("dryrun"))> \
1128 @ Dry run</label>
1129 @ <br><label><input type="checkbox" name="domod" %s(PCK("domod"))> \
1130 @ Require moderator approval</label>
@@ -1235,11 +1236,11 @@
1236 @ <input type="hidden" name="fpid" value="%h(P("fpid"))">
1237 @ <input type="hidden" name="nullout" value="1">
1238 @ <input type="hidden" name="mimetype" value="%h(zMimetype)">
1239 @ <input type="hidden" name="content" value="%h(zContent)">
1240 if( zTitle ){
1241 @ <input aria-label="Title" type="hidden" name="title" value="%h(zTitle)">
1242 }
1243 }else if( P("edit") ){
1244 /* Provide an edit to the fpid post */
1245 zMimetype = P("mimetype");
1246 zContent = PT("content");
1247
+3 -2
--- src/info.c
+++ src/info.c
@@ -666,10 +666,11 @@
666666
const char *zOrigDate;
667667
int okWiki = 0;
668668
Blob wiki_read_links = BLOB_INITIALIZER;
669669
Blob wiki_add_links = BLOB_INITIALIZER;
670670
671
+ Th_Store("current_checkin", zName);
671672
style_header("Check-in [%S]", zUuid);
672673
login_anonymous_available();
673674
zEUser = db_text(0,
674675
"SELECT value FROM tagxref"
675676
" WHERE tagid=%d AND rid=%d AND tagtype>0",
@@ -2776,15 +2777,15 @@
27762777
**
27772778
** Edit a check-in. (Check-ins are immutable and do not really change.
27782779
** This page really creates supplemental tags that affect the display
27792780
** of the check-in.)
27802781
**
2781
-** Query parmeters:
2782
+** Query parameters:
27822783
**
27832784
** rid=INTEGER Record ID of the check-in to edit (REQUIRED)
27842785
**
2785
-** POST parameters after pressing "Perview", "Cancel", or "Apply":
2786
+** POST parameters after pressing "Preview", "Cancel", or "Apply":
27862787
**
27872788
** c=TEXT New check-in comment
27882789
** u=TEXT New user name
27892790
** newclr Apply a background color
27902791
** clr=TEXT New background color (only if newclr)
27912792
--- src/info.c
+++ src/info.c
@@ -666,10 +666,11 @@
666 const char *zOrigDate;
667 int okWiki = 0;
668 Blob wiki_read_links = BLOB_INITIALIZER;
669 Blob wiki_add_links = BLOB_INITIALIZER;
670
 
671 style_header("Check-in [%S]", zUuid);
672 login_anonymous_available();
673 zEUser = db_text(0,
674 "SELECT value FROM tagxref"
675 " WHERE tagid=%d AND rid=%d AND tagtype>0",
@@ -2776,15 +2777,15 @@
2776 **
2777 ** Edit a check-in. (Check-ins are immutable and do not really change.
2778 ** This page really creates supplemental tags that affect the display
2779 ** of the check-in.)
2780 **
2781 ** Query parmeters:
2782 **
2783 ** rid=INTEGER Record ID of the check-in to edit (REQUIRED)
2784 **
2785 ** POST parameters after pressing "Perview", "Cancel", or "Apply":
2786 **
2787 ** c=TEXT New check-in comment
2788 ** u=TEXT New user name
2789 ** newclr Apply a background color
2790 ** clr=TEXT New background color (only if newclr)
2791
--- src/info.c
+++ src/info.c
@@ -666,10 +666,11 @@
666 const char *zOrigDate;
667 int okWiki = 0;
668 Blob wiki_read_links = BLOB_INITIALIZER;
669 Blob wiki_add_links = BLOB_INITIALIZER;
670
671 Th_Store("current_checkin", zName);
672 style_header("Check-in [%S]", zUuid);
673 login_anonymous_available();
674 zEUser = db_text(0,
675 "SELECT value FROM tagxref"
676 " WHERE tagid=%d AND rid=%d AND tagtype>0",
@@ -2776,15 +2777,15 @@
2777 **
2778 ** Edit a check-in. (Check-ins are immutable and do not really change.
2779 ** This page really creates supplemental tags that affect the display
2780 ** of the check-in.)
2781 **
2782 ** Query parameters:
2783 **
2784 ** rid=INTEGER Record ID of the check-in to edit (REQUIRED)
2785 **
2786 ** POST parameters after pressing "Preview", "Cancel", or "Apply":
2787 **
2788 ** c=TEXT New check-in comment
2789 ** u=TEXT New user name
2790 ** newclr Apply a background color
2791 ** clr=TEXT New background color (only if newclr)
2792
+3 -2
--- src/info.c
+++ src/info.c
@@ -666,10 +666,11 @@
666666
const char *zOrigDate;
667667
int okWiki = 0;
668668
Blob wiki_read_links = BLOB_INITIALIZER;
669669
Blob wiki_add_links = BLOB_INITIALIZER;
670670
671
+ Th_Store("current_checkin", zName);
671672
style_header("Check-in [%S]", zUuid);
672673
login_anonymous_available();
673674
zEUser = db_text(0,
674675
"SELECT value FROM tagxref"
675676
" WHERE tagid=%d AND rid=%d AND tagtype>0",
@@ -2776,15 +2777,15 @@
27762777
**
27772778
** Edit a check-in. (Check-ins are immutable and do not really change.
27782779
** This page really creates supplemental tags that affect the display
27792780
** of the check-in.)
27802781
**
2781
-** Query parmeters:
2782
+** Query parameters:
27822783
**
27832784
** rid=INTEGER Record ID of the check-in to edit (REQUIRED)
27842785
**
2785
-** POST parameters after pressing "Perview", "Cancel", or "Apply":
2786
+** POST parameters after pressing "Preview", "Cancel", or "Apply":
27862787
**
27872788
** c=TEXT New check-in comment
27882789
** u=TEXT New user name
27892790
** newclr Apply a background color
27902791
** clr=TEXT New background color (only if newclr)
27912792
--- src/info.c
+++ src/info.c
@@ -666,10 +666,11 @@
666 const char *zOrigDate;
667 int okWiki = 0;
668 Blob wiki_read_links = BLOB_INITIALIZER;
669 Blob wiki_add_links = BLOB_INITIALIZER;
670
 
671 style_header("Check-in [%S]", zUuid);
672 login_anonymous_available();
673 zEUser = db_text(0,
674 "SELECT value FROM tagxref"
675 " WHERE tagid=%d AND rid=%d AND tagtype>0",
@@ -2776,15 +2777,15 @@
2776 **
2777 ** Edit a check-in. (Check-ins are immutable and do not really change.
2778 ** This page really creates supplemental tags that affect the display
2779 ** of the check-in.)
2780 **
2781 ** Query parmeters:
2782 **
2783 ** rid=INTEGER Record ID of the check-in to edit (REQUIRED)
2784 **
2785 ** POST parameters after pressing "Perview", "Cancel", or "Apply":
2786 **
2787 ** c=TEXT New check-in comment
2788 ** u=TEXT New user name
2789 ** newclr Apply a background color
2790 ** clr=TEXT New background color (only if newclr)
2791
--- src/info.c
+++ src/info.c
@@ -666,10 +666,11 @@
666 const char *zOrigDate;
667 int okWiki = 0;
668 Blob wiki_read_links = BLOB_INITIALIZER;
669 Blob wiki_add_links = BLOB_INITIALIZER;
670
671 Th_Store("current_checkin", zName);
672 style_header("Check-in [%S]", zUuid);
673 login_anonymous_available();
674 zEUser = db_text(0,
675 "SELECT value FROM tagxref"
676 " WHERE tagid=%d AND rid=%d AND tagtype>0",
@@ -2776,15 +2777,15 @@
2777 **
2778 ** Edit a check-in. (Check-ins are immutable and do not really change.
2779 ** This page really creates supplemental tags that affect the display
2780 ** of the check-in.)
2781 **
2782 ** Query parameters:
2783 **
2784 ** rid=INTEGER Record ID of the check-in to edit (REQUIRED)
2785 **
2786 ** POST parameters after pressing "Preview", "Cancel", or "Apply":
2787 **
2788 ** c=TEXT New check-in comment
2789 ** u=TEXT New user name
2790 ** newclr Apply a background color
2791 ** clr=TEXT New background color (only if newclr)
2792
+34 -28
--- src/login.c
+++ src/login.c
@@ -678,20 +678,18 @@
678678
}else{
679679
zAnonPw = 0;
680680
}
681681
@ <table class="login_out">
682682
@ <tr>
683
- @ <td class="form_label">User ID:</td>
684
- if( anonFlag ){
685
- @ <td><input type="text" id="u" name="u" value="anonymous" size="30"></td>
686
- }else{
687
- @ <td><input type="text" id="u" name="u" value="" size="30" /></td>
688
- }
683
+ @ <td class="form_label" id="userlabel1">User ID:</td>
684
+ @ <td><input type="text" id="u" aria-labelledby="userlabel1" name="u" \
685
+ @ size="30" value="%s(anonFlag?"anonymous":"")"></td>
689686
@ </tr>
690687
@ <tr>
691
- @ <td class="form_label">Password:</td>
692
- @ <td><input type="password" id="p" name="p" value="" size="30" />\
688
+ @ <td class="form_label" id="pswdlabel">Password:</td>
689
+ @ <td><input aria-labelledby="pswdlabel" type="password" id="p" \
690
+ @ name="p" value="" size="30" />\
693691
if( zAnonPw && !noAnon ){
694692
captcha_speakit_button(uSeed, "Speak password for \"anonymous\"");
695693
}
696694
@ </td>
697695
@ </tr>
@@ -750,16 +748,19 @@
750748
if( g.perm.Password ){
751749
@ <hr>
752750
@ <p>Change Password for user <b>%h(g.zLogin)</b>:</p>
753751
form_begin(0, "%R/login");
754752
@ <table>
755
- @ <tr><td class="form_label">Old Password:</td>
756
- @ <td><input type="password" name="p" size="30" /></td></tr>
757
- @ <tr><td class="form_label">New Password:</td>
758
- @ <td><input type="password" name="n1" size="30" /></td></tr>
759
- @ <tr><td class="form_label">Repeat New Password:</td>
760
- @ <td><input type="password" name="n2" size="30" /></td></tr>
753
+ @ <tr><td class="form_label" id="oldpw">Old Password:</td>
754
+ @ <td><input aria-labelledby="oldpw" type="password" name="p" \
755
+ @ size="30"/></td></tr>
756
+ @ <tr><td class="form_label" id="newpw">New Password:</td>
757
+ @ <td><input aria-labelledby="newpw" type="password" name="n1" \
758
+ @ size="30" /></td></tr>
759
+ @ <tr><td class="form_label" id="reppw">Repeat New Password:</td>
760
+ @ <td><input aria-labledby="reppw" type="password" name="n2" \
761
+ @ size="30" /></td></tr>
761762
@ <tr><td></td>
762763
@ <td><input type="submit" value="Change Password" /></td></tr>
763764
@ </table>
764765
@ </form>
765766
}
@@ -1690,57 +1691,62 @@
16901691
@ <input type="hidden" name="g" value="%h(P("g"))" />
16911692
}
16921693
@ <p><input type="hidden" name="captchaseed" value="%u(uSeed)" />
16931694
@ <table class="login_out">
16941695
@ <tr>
1695
- @ <td class="form_label" align="right">User ID:</td>
1696
- @ <td><input type="text" name="u" value="%h(zUserID)" size="30"></td>
1696
+ @ <td class="form_label" align="right" id="uid">User ID:</td>
1697
+ @ <td><input aria-labelledby="uid" type="text" name="u" \
1698
+ @ value="%h(zUserID)" size="30"></td>
16971699
@
16981700
if( iErrLine==1 ){
16991701
@ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
17001702
}
17011703
@ <tr>
1702
- @ <td class="form_label" align="right">Display Name:</td>
1703
- @ <td><input type="text" name="dn" value="%h(zDName)" size="30"></td>
1704
+ @ <td class="form_label" align="right" id="dpyname">Display Name:</td>
1705
+ @ <td><input aria-labelledby="dpyname" type="text" name="dn" \
1706
+ @ value="%h(zDName)" size="30"></td>
17041707
@ </tr>
17051708
if( iErrLine==2 ){
17061709
@ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
17071710
}
17081711
@ </tr>
17091712
@ <tr>
1710
- @ <td class="form_label" align="right">Email Address:</td>
1711
- @ <td><input type="text" name="ea" value="%h(zEAddr)" size="30"></td>
1713
+ @ <td class="form_label" align="right" id="emaddr">Email Address:</td>
1714
+ @ <td><input aria-labelledby="emaddr" type="text" name="ea" \
1715
+ @ value="%h(zEAddr)" size="30"></td>
17121716
@ </tr>
17131717
if( iErrLine==3 ){
17141718
@ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
17151719
}
17161720
if( canDoAlerts ){
17171721
int a = atoi(PD("alerts","1"));
17181722
@ <tr>
1719
- @ <td class="form_label" align="right">Email&nbsp;Alerts?</td>
1720
- @ <td><select size='1' name='alerts'>
1723
+ @ <td class="form_label" align="right" id="emalrt">Email&nbsp;Alerts?</td>
1724
+ @ <td><select aria-labelledby="emalrt" size='1' name='alerts'>
17211725
@ <option value="1" %s(a?"selected":"")>Yes</option>
17221726
@ <option value="0" %s(!a?"selected":"")>No</option>
17231727
@ </select></td></tr>
17241728
}
17251729
@ <tr>
1726
- @ <td class="form_label" align="right">Password:</td>
1727
- @ <td><input type="password" name="p" value="%h(zPasswd)" size="30"></td>
1730
+ @ <td class="form_label" align="right" id="pswd">Password:</td>
1731
+ @ <td><input aria-labelledby="pswd" type="password" name="p" \
1732
+ @ value="%h(zPasswd)" size="30"></td>
17281733
@ <tr>
17291734
if( iErrLine==4 ){
17301735
@ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
17311736
}
17321737
@ <tr>
1733
- @ <td class="form_label" align="right">Confirm:</td>
1734
- @ <td><input type="password" name="cp" value="%h(zConfirm)" size="30"></td>
1738
+ @ <td class="form_label" align="right" id="pwcfrm">Confirm:</td>
1739
+ @ <td><input aria-labelledby="pwcfrm" type="password" name="cp" \
1740
+ @ value="%h(zConfirm)" size="30"></td>
17351741
@ </tr>
17361742
if( iErrLine==5 ){
17371743
@ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
17381744
}
17391745
@ <tr>
1740
- @ <td class="form_label" align="right">Captcha:</td>
1741
- @ <td><input type="text" name="captcha" \
1746
+ @ <td class="form_label" align="right" id="cptcha">Captcha:</td>
1747
+ @ <td><input type="text" name="captcha" aria-labelledby="cptcha" \
17421748
@ value="%h(captchaIsCorrect?zDecoded:"")" size="30">
17431749
captcha_speakit_button(uSeed, "Speak the captcha text");
17441750
@ </td>
17451751
@ </tr>
17461752
if( iErrLine==6 ){
17471753
--- src/login.c
+++ src/login.c
@@ -678,20 +678,18 @@
678 }else{
679 zAnonPw = 0;
680 }
681 @ <table class="login_out">
682 @ <tr>
683 @ <td class="form_label">User ID:</td>
684 if( anonFlag ){
685 @ <td><input type="text" id="u" name="u" value="anonymous" size="30"></td>
686 }else{
687 @ <td><input type="text" id="u" name="u" value="" size="30" /></td>
688 }
689 @ </tr>
690 @ <tr>
691 @ <td class="form_label">Password:</td>
692 @ <td><input type="password" id="p" name="p" value="" size="30" />\
 
693 if( zAnonPw && !noAnon ){
694 captcha_speakit_button(uSeed, "Speak password for \"anonymous\"");
695 }
696 @ </td>
697 @ </tr>
@@ -750,16 +748,19 @@
750 if( g.perm.Password ){
751 @ <hr>
752 @ <p>Change Password for user <b>%h(g.zLogin)</b>:</p>
753 form_begin(0, "%R/login");
754 @ <table>
755 @ <tr><td class="form_label">Old Password:</td>
756 @ <td><input type="password" name="p" size="30" /></td></tr>
757 @ <tr><td class="form_label">New Password:</td>
758 @ <td><input type="password" name="n1" size="30" /></td></tr>
759 @ <tr><td class="form_label">Repeat New Password:</td>
760 @ <td><input type="password" name="n2" size="30" /></td></tr>
 
 
 
761 @ <tr><td></td>
762 @ <td><input type="submit" value="Change Password" /></td></tr>
763 @ </table>
764 @ </form>
765 }
@@ -1690,57 +1691,62 @@
1690 @ <input type="hidden" name="g" value="%h(P("g"))" />
1691 }
1692 @ <p><input type="hidden" name="captchaseed" value="%u(uSeed)" />
1693 @ <table class="login_out">
1694 @ <tr>
1695 @ <td class="form_label" align="right">User ID:</td>
1696 @ <td><input type="text" name="u" value="%h(zUserID)" size="30"></td>
 
1697 @
1698 if( iErrLine==1 ){
1699 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1700 }
1701 @ <tr>
1702 @ <td class="form_label" align="right">Display Name:</td>
1703 @ <td><input type="text" name="dn" value="%h(zDName)" size="30"></td>
 
1704 @ </tr>
1705 if( iErrLine==2 ){
1706 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1707 }
1708 @ </tr>
1709 @ <tr>
1710 @ <td class="form_label" align="right">Email Address:</td>
1711 @ <td><input type="text" name="ea" value="%h(zEAddr)" size="30"></td>
 
1712 @ </tr>
1713 if( iErrLine==3 ){
1714 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1715 }
1716 if( canDoAlerts ){
1717 int a = atoi(PD("alerts","1"));
1718 @ <tr>
1719 @ <td class="form_label" align="right">Email&nbsp;Alerts?</td>
1720 @ <td><select size='1' name='alerts'>
1721 @ <option value="1" %s(a?"selected":"")>Yes</option>
1722 @ <option value="0" %s(!a?"selected":"")>No</option>
1723 @ </select></td></tr>
1724 }
1725 @ <tr>
1726 @ <td class="form_label" align="right">Password:</td>
1727 @ <td><input type="password" name="p" value="%h(zPasswd)" size="30"></td>
 
1728 @ <tr>
1729 if( iErrLine==4 ){
1730 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1731 }
1732 @ <tr>
1733 @ <td class="form_label" align="right">Confirm:</td>
1734 @ <td><input type="password" name="cp" value="%h(zConfirm)" size="30"></td>
 
1735 @ </tr>
1736 if( iErrLine==5 ){
1737 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1738 }
1739 @ <tr>
1740 @ <td class="form_label" align="right">Captcha:</td>
1741 @ <td><input type="text" name="captcha" \
1742 @ value="%h(captchaIsCorrect?zDecoded:"")" size="30">
1743 captcha_speakit_button(uSeed, "Speak the captcha text");
1744 @ </td>
1745 @ </tr>
1746 if( iErrLine==6 ){
1747
--- src/login.c
+++ src/login.c
@@ -678,20 +678,18 @@
678 }else{
679 zAnonPw = 0;
680 }
681 @ <table class="login_out">
682 @ <tr>
683 @ <td class="form_label" id="userlabel1">User ID:</td>
684 @ <td><input type="text" id="u" aria-labelledby="userlabel1" name="u" \
685 @ size="30" value="%s(anonFlag?"anonymous":"")"></td>
 
 
 
686 @ </tr>
687 @ <tr>
688 @ <td class="form_label" id="pswdlabel">Password:</td>
689 @ <td><input aria-labelledby="pswdlabel" type="password" id="p" \
690 @ name="p" value="" size="30" />\
691 if( zAnonPw && !noAnon ){
692 captcha_speakit_button(uSeed, "Speak password for \"anonymous\"");
693 }
694 @ </td>
695 @ </tr>
@@ -750,16 +748,19 @@
748 if( g.perm.Password ){
749 @ <hr>
750 @ <p>Change Password for user <b>%h(g.zLogin)</b>:</p>
751 form_begin(0, "%R/login");
752 @ <table>
753 @ <tr><td class="form_label" id="oldpw">Old Password:</td>
754 @ <td><input aria-labelledby="oldpw" type="password" name="p" \
755 @ size="30"/></td></tr>
756 @ <tr><td class="form_label" id="newpw">New Password:</td>
757 @ <td><input aria-labelledby="newpw" type="password" name="n1" \
758 @ size="30" /></td></tr>
759 @ <tr><td class="form_label" id="reppw">Repeat New Password:</td>
760 @ <td><input aria-labledby="reppw" type="password" name="n2" \
761 @ size="30" /></td></tr>
762 @ <tr><td></td>
763 @ <td><input type="submit" value="Change Password" /></td></tr>
764 @ </table>
765 @ </form>
766 }
@@ -1690,57 +1691,62 @@
1691 @ <input type="hidden" name="g" value="%h(P("g"))" />
1692 }
1693 @ <p><input type="hidden" name="captchaseed" value="%u(uSeed)" />
1694 @ <table class="login_out">
1695 @ <tr>
1696 @ <td class="form_label" align="right" id="uid">User ID:</td>
1697 @ <td><input aria-labelledby="uid" type="text" name="u" \
1698 @ value="%h(zUserID)" size="30"></td>
1699 @
1700 if( iErrLine==1 ){
1701 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1702 }
1703 @ <tr>
1704 @ <td class="form_label" align="right" id="dpyname">Display Name:</td>
1705 @ <td><input aria-labelledby="dpyname" type="text" name="dn" \
1706 @ value="%h(zDName)" size="30"></td>
1707 @ </tr>
1708 if( iErrLine==2 ){
1709 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1710 }
1711 @ </tr>
1712 @ <tr>
1713 @ <td class="form_label" align="right" id="emaddr">Email Address:</td>
1714 @ <td><input aria-labelledby="emaddr" type="text" name="ea" \
1715 @ value="%h(zEAddr)" size="30"></td>
1716 @ </tr>
1717 if( iErrLine==3 ){
1718 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1719 }
1720 if( canDoAlerts ){
1721 int a = atoi(PD("alerts","1"));
1722 @ <tr>
1723 @ <td class="form_label" align="right" id="emalrt">Email&nbsp;Alerts?</td>
1724 @ <td><select aria-labelledby="emalrt" size='1' name='alerts'>
1725 @ <option value="1" %s(a?"selected":"")>Yes</option>
1726 @ <option value="0" %s(!a?"selected":"")>No</option>
1727 @ </select></td></tr>
1728 }
1729 @ <tr>
1730 @ <td class="form_label" align="right" id="pswd">Password:</td>
1731 @ <td><input aria-labelledby="pswd" type="password" name="p" \
1732 @ value="%h(zPasswd)" size="30"></td>
1733 @ <tr>
1734 if( iErrLine==4 ){
1735 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1736 }
1737 @ <tr>
1738 @ <td class="form_label" align="right" id="pwcfrm">Confirm:</td>
1739 @ <td><input aria-labelledby="pwcfrm" type="password" name="cp" \
1740 @ value="%h(zConfirm)" size="30"></td>
1741 @ </tr>
1742 if( iErrLine==5 ){
1743 @ <tr><td><td><span class='loginError'>&uarr; %h(zErr)</span></td></tr>
1744 }
1745 @ <tr>
1746 @ <td class="form_label" align="right" id="cptcha">Captcha:</td>
1747 @ <td><input type="text" name="captcha" aria-labelledby="cptcha" \
1748 @ value="%h(captchaIsCorrect?zDecoded:"")" size="30">
1749 captcha_speakit_button(uSeed, "Speak the captcha text");
1750 @ </td>
1751 @ </tr>
1752 if( iErrLine==6 ){
1753
+3 -3
--- src/printf.c
+++ src/printf.c
@@ -34,11 +34,11 @@
3434
** The following macros help determine those lengths. FOSSIL_HASH_DIGITS
3535
** is the default number of digits to display to humans. This value can
3636
** be overridden using the hash-digits setting. FOSSIL_HASH_DIGITS_URL
3737
** is the minimum number of digits to be used in URLs. The number used
3838
** will always be at least 6 more than the number used for human output,
39
-** or 40 if the number of digits in human output is 34 or more.
39
+** or HNAME_MAX, whichever is least.
4040
*/
4141
#ifndef FOSSIL_HASH_DIGITS
4242
# define FOSSIL_HASH_DIGITS 10 /* For %S (human display) */
4343
#endif
4444
#ifndef FOSSIL_HASH_DIGITS_URL
@@ -54,14 +54,14 @@
5454
static int nDigitHuman = 0;
5555
static int nDigitUrl = 0;
5656
if( nDigitHuman==0 ){
5757
nDigitHuman = db_get_int("hash-digits", FOSSIL_HASH_DIGITS);
5858
if( nDigitHuman < 6 ) nDigitHuman = 6;
59
- if( nDigitHuman > 40 ) nDigitHuman = 40;
59
+ if( nDigitHuman > HNAME_MAX ) nDigitHuman = HNAME_MAX;
6060
nDigitUrl = nDigitHuman + 6;
6161
if( nDigitUrl < FOSSIL_HASH_DIGITS_URL ) nDigitUrl = FOSSIL_HASH_DIGITS_URL;
62
- if( nDigitUrl > 40 ) nDigitUrl = 40;
62
+ if( nDigitUrl > HNAME_MAX ) nDigitUrl = HNAME_MAX;
6363
}
6464
return bForUrl ? nDigitUrl : nDigitHuman;
6565
}
6666
6767
/*
6868
--- src/printf.c
+++ src/printf.c
@@ -34,11 +34,11 @@
34 ** The following macros help determine those lengths. FOSSIL_HASH_DIGITS
35 ** is the default number of digits to display to humans. This value can
36 ** be overridden using the hash-digits setting. FOSSIL_HASH_DIGITS_URL
37 ** is the minimum number of digits to be used in URLs. The number used
38 ** will always be at least 6 more than the number used for human output,
39 ** or 40 if the number of digits in human output is 34 or more.
40 */
41 #ifndef FOSSIL_HASH_DIGITS
42 # define FOSSIL_HASH_DIGITS 10 /* For %S (human display) */
43 #endif
44 #ifndef FOSSIL_HASH_DIGITS_URL
@@ -54,14 +54,14 @@
54 static int nDigitHuman = 0;
55 static int nDigitUrl = 0;
56 if( nDigitHuman==0 ){
57 nDigitHuman = db_get_int("hash-digits", FOSSIL_HASH_DIGITS);
58 if( nDigitHuman < 6 ) nDigitHuman = 6;
59 if( nDigitHuman > 40 ) nDigitHuman = 40;
60 nDigitUrl = nDigitHuman + 6;
61 if( nDigitUrl < FOSSIL_HASH_DIGITS_URL ) nDigitUrl = FOSSIL_HASH_DIGITS_URL;
62 if( nDigitUrl > 40 ) nDigitUrl = 40;
63 }
64 return bForUrl ? nDigitUrl : nDigitHuman;
65 }
66
67 /*
68
--- src/printf.c
+++ src/printf.c
@@ -34,11 +34,11 @@
34 ** The following macros help determine those lengths. FOSSIL_HASH_DIGITS
35 ** is the default number of digits to display to humans. This value can
36 ** be overridden using the hash-digits setting. FOSSIL_HASH_DIGITS_URL
37 ** is the minimum number of digits to be used in URLs. The number used
38 ** will always be at least 6 more than the number used for human output,
39 ** or HNAME_MAX, whichever is least.
40 */
41 #ifndef FOSSIL_HASH_DIGITS
42 # define FOSSIL_HASH_DIGITS 10 /* For %S (human display) */
43 #endif
44 #ifndef FOSSIL_HASH_DIGITS_URL
@@ -54,14 +54,14 @@
54 static int nDigitHuman = 0;
55 static int nDigitUrl = 0;
56 if( nDigitHuman==0 ){
57 nDigitHuman = db_get_int("hash-digits", FOSSIL_HASH_DIGITS);
58 if( nDigitHuman < 6 ) nDigitHuman = 6;
59 if( nDigitHuman > HNAME_MAX ) nDigitHuman = HNAME_MAX;
60 nDigitUrl = nDigitHuman + 6;
61 if( nDigitUrl < FOSSIL_HASH_DIGITS_URL ) nDigitUrl = FOSSIL_HASH_DIGITS_URL;
62 if( nDigitUrl > HNAME_MAX ) nDigitUrl = HNAME_MAX;
63 }
64 return bForUrl ? nDigitUrl : nDigitHuman;
65 }
66
67 /*
68
+3 -3
--- src/printf.c
+++ src/printf.c
@@ -34,11 +34,11 @@
3434
** The following macros help determine those lengths. FOSSIL_HASH_DIGITS
3535
** is the default number of digits to display to humans. This value can
3636
** be overridden using the hash-digits setting. FOSSIL_HASH_DIGITS_URL
3737
** is the minimum number of digits to be used in URLs. The number used
3838
** will always be at least 6 more than the number used for human output,
39
-** or 40 if the number of digits in human output is 34 or more.
39
+** or HNAME_MAX, whichever is least.
4040
*/
4141
#ifndef FOSSIL_HASH_DIGITS
4242
# define FOSSIL_HASH_DIGITS 10 /* For %S (human display) */
4343
#endif
4444
#ifndef FOSSIL_HASH_DIGITS_URL
@@ -54,14 +54,14 @@
5454
static int nDigitHuman = 0;
5555
static int nDigitUrl = 0;
5656
if( nDigitHuman==0 ){
5757
nDigitHuman = db_get_int("hash-digits", FOSSIL_HASH_DIGITS);
5858
if( nDigitHuman < 6 ) nDigitHuman = 6;
59
- if( nDigitHuman > 40 ) nDigitHuman = 40;
59
+ if( nDigitHuman > HNAME_MAX ) nDigitHuman = HNAME_MAX;
6060
nDigitUrl = nDigitHuman + 6;
6161
if( nDigitUrl < FOSSIL_HASH_DIGITS_URL ) nDigitUrl = FOSSIL_HASH_DIGITS_URL;
62
- if( nDigitUrl > 40 ) nDigitUrl = 40;
62
+ if( nDigitUrl > HNAME_MAX ) nDigitUrl = HNAME_MAX;
6363
}
6464
return bForUrl ? nDigitUrl : nDigitHuman;
6565
}
6666
6767
/*
6868
--- src/printf.c
+++ src/printf.c
@@ -34,11 +34,11 @@
34 ** The following macros help determine those lengths. FOSSIL_HASH_DIGITS
35 ** is the default number of digits to display to humans. This value can
36 ** be overridden using the hash-digits setting. FOSSIL_HASH_DIGITS_URL
37 ** is the minimum number of digits to be used in URLs. The number used
38 ** will always be at least 6 more than the number used for human output,
39 ** or 40 if the number of digits in human output is 34 or more.
40 */
41 #ifndef FOSSIL_HASH_DIGITS
42 # define FOSSIL_HASH_DIGITS 10 /* For %S (human display) */
43 #endif
44 #ifndef FOSSIL_HASH_DIGITS_URL
@@ -54,14 +54,14 @@
54 static int nDigitHuman = 0;
55 static int nDigitUrl = 0;
56 if( nDigitHuman==0 ){
57 nDigitHuman = db_get_int("hash-digits", FOSSIL_HASH_DIGITS);
58 if( nDigitHuman < 6 ) nDigitHuman = 6;
59 if( nDigitHuman > 40 ) nDigitHuman = 40;
60 nDigitUrl = nDigitHuman + 6;
61 if( nDigitUrl < FOSSIL_HASH_DIGITS_URL ) nDigitUrl = FOSSIL_HASH_DIGITS_URL;
62 if( nDigitUrl > 40 ) nDigitUrl = 40;
63 }
64 return bForUrl ? nDigitUrl : nDigitHuman;
65 }
66
67 /*
68
--- src/printf.c
+++ src/printf.c
@@ -34,11 +34,11 @@
34 ** The following macros help determine those lengths. FOSSIL_HASH_DIGITS
35 ** is the default number of digits to display to humans. This value can
36 ** be overridden using the hash-digits setting. FOSSIL_HASH_DIGITS_URL
37 ** is the minimum number of digits to be used in URLs. The number used
38 ** will always be at least 6 more than the number used for human output,
39 ** or HNAME_MAX, whichever is least.
40 */
41 #ifndef FOSSIL_HASH_DIGITS
42 # define FOSSIL_HASH_DIGITS 10 /* For %S (human display) */
43 #endif
44 #ifndef FOSSIL_HASH_DIGITS_URL
@@ -54,14 +54,14 @@
54 static int nDigitHuman = 0;
55 static int nDigitUrl = 0;
56 if( nDigitHuman==0 ){
57 nDigitHuman = db_get_int("hash-digits", FOSSIL_HASH_DIGITS);
58 if( nDigitHuman < 6 ) nDigitHuman = 6;
59 if( nDigitHuman > HNAME_MAX ) nDigitHuman = HNAME_MAX;
60 nDigitUrl = nDigitHuman + 6;
61 if( nDigitUrl < FOSSIL_HASH_DIGITS_URL ) nDigitUrl = FOSSIL_HASH_DIGITS_URL;
62 if( nDigitUrl > HNAME_MAX ) nDigitUrl = HNAME_MAX;
63 }
64 return bForUrl ? nDigitUrl : nDigitHuman;
65 }
66
67 /*
68
+32 -25
--- src/setup.c
+++ src/setup.c
@@ -201,16 +201,17 @@
201201
admin_log("Set option [%q] to [%q].",
202202
zVar, iQ ? "on" : "off");
203203
iVal = iQ;
204204
}
205205
}
206
- @ <label><input type="checkbox" name="%s(zQParm)"
206
+ @ <label><input type="checkbox" name="%s(zQParm)" \
207
+ @ aria-label="%s(zLabel[0]?zLabel:zQParm)" \
207208
if( iVal ){
208
- @ checked="checked"
209
+ @ checked="checked" \
209210
}
210211
if( disabled ){
211
- @ disabled="disabled"
212
+ @ disabled="disabled" \
212213
}
213214
@ /> <b>%s(zLabel)</b></label>
214215
}
215216
216217
/*
@@ -232,12 +233,12 @@
232233
db_set(zVar, zQ, 0);
233234
admin_log("Set entry_attribute %Q to: %.*s%s",
234235
zVar, 20, zQ, (nZQ>20 ? "..." : ""));
235236
zVal = zQ;
236237
}
237
- @ <input type="text" id="%s(zQParm)" name="%s(zQParm)" value="%h(zVal)" \
238
- @ size="%d(width)" \
238
+ @ <input aria-label="%h(zLabel[0]?zLabel:zQParm)" type="text" \
239
+ @ id="%s(zQParm)" name="%s(zQParm)" value="%h(zVal)" size="%d(width)" \
239240
if( disabled ){
240241
@ disabled="disabled" \
241242
}
242243
@ /> <b>%s(zLabel)</b>
243244
}
@@ -263,16 +264,17 @@
263264
admin_log("Set textarea_attribute %Q to: %.*s%s",
264265
zVar, 20, zQ, (nZQ>20 ? "..." : ""));
265266
z = zQ;
266267
}
267268
if( rows>0 && cols>0 ){
268
- @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)"
269
+ @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)" \
270
+ @ aria-label="%h(zLabel[0]?zLabel:zQP)" \
269271
if( disabled ){
270
- @ disabled="disabled"
272
+ @ disabled="disabled" \
271273
}
272274
@ cols="%d(cols)">%h(z)</textarea>
273
- if( zLabel && *zLabel ){
275
+ if( *zLabel ){
274276
@ <span class="textareaLabel">%s(zLabel)</span>
275277
}
276278
}
277279
return z;
278280
}
@@ -297,11 +299,11 @@
297299
db_set(zVar, zQ, 0);
298300
admin_log("Set multiple_choice_attribute %Q to: %.*s%s",
299301
zVar, 20, zQ, (nZQ>20 ? "..." : ""));
300302
z = zQ;
301303
}
302
- @ <select size="1" name="%s(zQP)" id="id%s(zQP)">
304
+ @ <select aria-label="%h(zLabel)" size="1" name="%s(zQP)" id="id%s(zQP)">
303305
for(i=0; i<nChoice*2; i+=2){
304306
const char *zSel = fossil_strcmp(azChoice[i],z)==0 ? " selected" : "";
305307
@ <option value="%h(azChoice[i])"%s(zSel)>%h(azChoice[i+1])</option>
306308
}
307309
@ </select> <b>%h(zLabel)</b>
@@ -398,11 +400,11 @@
398400
@ <hr />
399401
onoff_attribute("Allow HTTP_AUTHENTICATION authentication",
400402
"http_authentication_ok", "http_authentication_ok", 0, 0);
401403
@ <p>When enabled, allow the use of the HTTP_AUTHENTICATION environment
402404
@ variable or the "Authentication:" HTTP header to find the username and
403
- @ password. This is another way of supporting Basic Authenitication.
405
+ @ password. This is another way of supporting Basic Authentication.
404406
@ (Property: "http_authentication_ok")
405407
@ </p>
406408
@
407409
@ <hr />
408410
entry_attribute("Login expiration time", 6, "cookie-expire", "cex",
@@ -606,25 +608,30 @@
606608
@
607609
@ <form action="%s(g.zTop)/setup_login_group" method="post"><div>
608610
login_insert_csrf_secret();
609611
@ <blockquote><table border="0">
610612
@
611
- @ <tr><th align="right">Repository filename in group to join:</th>
612
- @ <td width="5"></td><td>
613
- @ <input type="text" size="50" value="%h(zRepo)" name="repo"></td></tr>
614
- @
615
- @ <tr><th align="right">Login on the above repo:</th>
616
- @ <td width="5"></td><td>
617
- @ <input type="text" size="20" value="%h(zLogin)" name="login"></td></tr>
618
- @
619
- @ <tr><th align="right">Password:</th>
620
- @ <td width="5"></td><td>
621
- @ <input type="password" size="20" name="pw"></td></tr>
622
- @
623
- @ <tr><th align="right">Name of login-group:</th>
624
- @ <td width="5"></td><td>
625
- @ <input type="text" size="30" value="%h(zNewName)" name="newname">
613
+ @ <tr><th align="right" id="rfigtj">Repository filename \
614
+ @ in group to join:</th>
615
+ @ <td width="5"></td><td>
616
+ @ <input aria-labelledby="rfigtj" type="text" size="50" \
617
+ @ value="%h(zRepo)" name="repo"></td></tr>
618
+ @
619
+ @ <tr><th align="right" id="lotar">Login on the above repo:</th>
620
+ @ <td width="5"></td><td>
621
+ @ <input aria-labelledby="lotar" type="text" size="20" \
622
+ @ value="%h(zLogin)" name="login"></td></tr>
623
+ @
624
+ @ <tr><th align="right" id="lgpw">Password:</th>
625
+ @ <td width="5"></td><td>
626
+ @ <input aria-labelledby="lgpw" type="password" size="20" name="pw">\
627
+ @ </td></tr>
628
+ @
629
+ @ <tr><th align="right" id="nolg">Name of login-group:</th>
630
+ @ <td width="5"></td><td>
631
+ @ <input aria-labelledby="nolg" type="text" size="30" \
632
+ @ value="%h(zNewName)" name="newname">
626633
@ (only used if creating a new login-group).</td></tr>
627634
@
628635
@ <tr><td colspan="3" align="center">
629636
@ <input type="submit" value="Join" name="join"></td></tr>
630637
@ </table></blockquote></div></form>
631638
--- src/setup.c
+++ src/setup.c
@@ -201,16 +201,17 @@
201 admin_log("Set option [%q] to [%q].",
202 zVar, iQ ? "on" : "off");
203 iVal = iQ;
204 }
205 }
206 @ <label><input type="checkbox" name="%s(zQParm)"
 
207 if( iVal ){
208 @ checked="checked"
209 }
210 if( disabled ){
211 @ disabled="disabled"
212 }
213 @ /> <b>%s(zLabel)</b></label>
214 }
215
216 /*
@@ -232,12 +233,12 @@
232 db_set(zVar, zQ, 0);
233 admin_log("Set entry_attribute %Q to: %.*s%s",
234 zVar, 20, zQ, (nZQ>20 ? "..." : ""));
235 zVal = zQ;
236 }
237 @ <input type="text" id="%s(zQParm)" name="%s(zQParm)" value="%h(zVal)" \
238 @ size="%d(width)" \
239 if( disabled ){
240 @ disabled="disabled" \
241 }
242 @ /> <b>%s(zLabel)</b>
243 }
@@ -263,16 +264,17 @@
263 admin_log("Set textarea_attribute %Q to: %.*s%s",
264 zVar, 20, zQ, (nZQ>20 ? "..." : ""));
265 z = zQ;
266 }
267 if( rows>0 && cols>0 ){
268 @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)"
 
269 if( disabled ){
270 @ disabled="disabled"
271 }
272 @ cols="%d(cols)">%h(z)</textarea>
273 if( zLabel && *zLabel ){
274 @ <span class="textareaLabel">%s(zLabel)</span>
275 }
276 }
277 return z;
278 }
@@ -297,11 +299,11 @@
297 db_set(zVar, zQ, 0);
298 admin_log("Set multiple_choice_attribute %Q to: %.*s%s",
299 zVar, 20, zQ, (nZQ>20 ? "..." : ""));
300 z = zQ;
301 }
302 @ <select size="1" name="%s(zQP)" id="id%s(zQP)">
303 for(i=0; i<nChoice*2; i+=2){
304 const char *zSel = fossil_strcmp(azChoice[i],z)==0 ? " selected" : "";
305 @ <option value="%h(azChoice[i])"%s(zSel)>%h(azChoice[i+1])</option>
306 }
307 @ </select> <b>%h(zLabel)</b>
@@ -398,11 +400,11 @@
398 @ <hr />
399 onoff_attribute("Allow HTTP_AUTHENTICATION authentication",
400 "http_authentication_ok", "http_authentication_ok", 0, 0);
401 @ <p>When enabled, allow the use of the HTTP_AUTHENTICATION environment
402 @ variable or the "Authentication:" HTTP header to find the username and
403 @ password. This is another way of supporting Basic Authenitication.
404 @ (Property: "http_authentication_ok")
405 @ </p>
406 @
407 @ <hr />
408 entry_attribute("Login expiration time", 6, "cookie-expire", "cex",
@@ -606,25 +608,30 @@
606 @
607 @ <form action="%s(g.zTop)/setup_login_group" method="post"><div>
608 login_insert_csrf_secret();
609 @ <blockquote><table border="0">
610 @
611 @ <tr><th align="right">Repository filename in group to join:</th>
612 @ <td width="5"></td><td>
613 @ <input type="text" size="50" value="%h(zRepo)" name="repo"></td></tr>
614 @
615 @ <tr><th align="right">Login on the above repo:</th>
616 @ <td width="5"></td><td>
617 @ <input type="text" size="20" value="%h(zLogin)" name="login"></td></tr>
618 @
619 @ <tr><th align="right">Password:</th>
620 @ <td width="5"></td><td>
621 @ <input type="password" size="20" name="pw"></td></tr>
622 @
623 @ <tr><th align="right">Name of login-group:</th>
624 @ <td width="5"></td><td>
625 @ <input type="text" size="30" value="%h(zNewName)" name="newname">
 
 
 
 
 
626 @ (only used if creating a new login-group).</td></tr>
627 @
628 @ <tr><td colspan="3" align="center">
629 @ <input type="submit" value="Join" name="join"></td></tr>
630 @ </table></blockquote></div></form>
631
--- src/setup.c
+++ src/setup.c
@@ -201,16 +201,17 @@
201 admin_log("Set option [%q] to [%q].",
202 zVar, iQ ? "on" : "off");
203 iVal = iQ;
204 }
205 }
206 @ <label><input type="checkbox" name="%s(zQParm)" \
207 @ aria-label="%s(zLabel[0]?zLabel:zQParm)" \
208 if( iVal ){
209 @ checked="checked" \
210 }
211 if( disabled ){
212 @ disabled="disabled" \
213 }
214 @ /> <b>%s(zLabel)</b></label>
215 }
216
217 /*
@@ -232,12 +233,12 @@
233 db_set(zVar, zQ, 0);
234 admin_log("Set entry_attribute %Q to: %.*s%s",
235 zVar, 20, zQ, (nZQ>20 ? "..." : ""));
236 zVal = zQ;
237 }
238 @ <input aria-label="%h(zLabel[0]?zLabel:zQParm)" type="text" \
239 @ id="%s(zQParm)" name="%s(zQParm)" value="%h(zVal)" size="%d(width)" \
240 if( disabled ){
241 @ disabled="disabled" \
242 }
243 @ /> <b>%s(zLabel)</b>
244 }
@@ -263,16 +264,17 @@
264 admin_log("Set textarea_attribute %Q to: %.*s%s",
265 zVar, 20, zQ, (nZQ>20 ? "..." : ""));
266 z = zQ;
267 }
268 if( rows>0 && cols>0 ){
269 @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)" \
270 @ aria-label="%h(zLabel[0]?zLabel:zQP)" \
271 if( disabled ){
272 @ disabled="disabled" \
273 }
274 @ cols="%d(cols)">%h(z)</textarea>
275 if( *zLabel ){
276 @ <span class="textareaLabel">%s(zLabel)</span>
277 }
278 }
279 return z;
280 }
@@ -297,11 +299,11 @@
299 db_set(zVar, zQ, 0);
300 admin_log("Set multiple_choice_attribute %Q to: %.*s%s",
301 zVar, 20, zQ, (nZQ>20 ? "..." : ""));
302 z = zQ;
303 }
304 @ <select aria-label="%h(zLabel)" size="1" name="%s(zQP)" id="id%s(zQP)">
305 for(i=0; i<nChoice*2; i+=2){
306 const char *zSel = fossil_strcmp(azChoice[i],z)==0 ? " selected" : "";
307 @ <option value="%h(azChoice[i])"%s(zSel)>%h(azChoice[i+1])</option>
308 }
309 @ </select> <b>%h(zLabel)</b>
@@ -398,11 +400,11 @@
400 @ <hr />
401 onoff_attribute("Allow HTTP_AUTHENTICATION authentication",
402 "http_authentication_ok", "http_authentication_ok", 0, 0);
403 @ <p>When enabled, allow the use of the HTTP_AUTHENTICATION environment
404 @ variable or the "Authentication:" HTTP header to find the username and
405 @ password. This is another way of supporting Basic Authentication.
406 @ (Property: "http_authentication_ok")
407 @ </p>
408 @
409 @ <hr />
410 entry_attribute("Login expiration time", 6, "cookie-expire", "cex",
@@ -606,25 +608,30 @@
608 @
609 @ <form action="%s(g.zTop)/setup_login_group" method="post"><div>
610 login_insert_csrf_secret();
611 @ <blockquote><table border="0">
612 @
613 @ <tr><th align="right" id="rfigtj">Repository filename \
614 @ in group to join:</th>
615 @ <td width="5"></td><td>
616 @ <input aria-labelledby="rfigtj" type="text" size="50" \
617 @ value="%h(zRepo)" name="repo"></td></tr>
618 @
619 @ <tr><th align="right" id="lotar">Login on the above repo:</th>
620 @ <td width="5"></td><td>
621 @ <input aria-labelledby="lotar" type="text" size="20" \
622 @ value="%h(zLogin)" name="login"></td></tr>
623 @
624 @ <tr><th align="right" id="lgpw">Password:</th>
625 @ <td width="5"></td><td>
626 @ <input aria-labelledby="lgpw" type="password" size="20" name="pw">\
627 @ </td></tr>
628 @
629 @ <tr><th align="right" id="nolg">Name of login-group:</th>
630 @ <td width="5"></td><td>
631 @ <input aria-labelledby="nolg" type="text" size="30" \
632 @ value="%h(zNewName)" name="newname">
633 @ (only used if creating a new login-group).</td></tr>
634 @
635 @ <tr><td colspan="3" align="center">
636 @ <input type="submit" value="Join" name="join"></td></tr>
637 @ </table></blockquote></div></form>
638
+16 -12
--- src/setupuser.c
+++ src/setupuser.c
@@ -534,24 +534,27 @@
534534
@ <input type="hidden" name="pw" value="*">
535535
}
536536
@ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))">
537537
@ <table width="100%%">
538538
@ <tr>
539
- @ <td class="usetupEditLabel">User ID:</td>
539
+ @ <td class="usetupEditLabel" id="suuid">User ID:</td>
540540
if( uid ){
541
- @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" />\
541
+ @ <td>%d(uid) <input aria-labelledby="suuid" type="hidden" \
542
+ @ name="id" value="%d(uid)"/>\
542543
@ </td>
543544
}else{
544
- @ <td>(new user)<input type="hidden" name="id" value="0" /></td>
545
+ @ <td>(new user)<input aria-labelledby="suuid" type="hidden" name="id" \
546
+ @ value="0" /></td>
545547
}
546548
@ </tr>
547549
@ <tr>
548
- @ <td class="usetupEditLabel">Login:</td>
550
+ @ <td class="usetupEditLabel" id="sulgn">Login:</td>
549551
if( login_is_special(zLogin) ){
550552
@ <td><b>%h(zLogin)</b></td>
551553
}else{
552
- @ <td><input type="text" name="login" value="%h(zLogin)" />\
554
+ @ <td><input aria-labelledby="sulgn" type="text" name="login" \
555
+ @ value="%h(zLogin)" />
553556
if( alert_tables_exist() ){
554557
int sid;
555558
sid = db_int(0, "SELECT subscriberId FROM subscriber"
556559
" WHERE suname=%Q", zLogin);
557560
if( sid>0 ){
@@ -559,12 +562,13 @@
559562
@ (subscription info for %h(zLogin))</a>\
560563
}
561564
}
562565
@ </td></tr>
563566
@ <tr>
564
- @ <td class="usetupEditLabel">Contact&nbsp;Info:</td>
565
- @ <td><textarea name="info" cols="40" rows="2">%h(zInfo)</textarea></td>
567
+ @ <td class="usetupEditLabel" id="sucnfo">Contact&nbsp;Info:</td>
568
+ @ <td><textarea aria-labelledby="sucnfo" name="info" cols="40" \
569
+ @ rows="2">%h(zInfo)</textarea></td>
566570
}
567571
@ </tr>
568572
@ <tr>
569573
@ <td class="usetupEditLabel">Capabilities:</td>
570574
@ <td width="100%%">
@@ -653,19 +657,19 @@
653657
@ <a href="%R/setup_ucap_list">(key)</a>
654658
@ </td>
655659
@ </tr>
656660
if( !login_is_special(zLogin) ){
657661
@ <tr>
658
- @ <td align="right">Password:</td>
662
+ @ <td align="right" id="supw">Password:</td>
659663
if( zPw[0] ){
660664
/* Obscure the password for all users */
661
- @ <td><input type="password" autocomplete="off" name="pw"\
662
- @ value="**********" /></td>
665
+ @ <td><input aria-labelledby="supw" type="password" autocomplete="off" \
666
+ @ name="pw" value="**********" /></td>
663667
}else{
664668
/* Show an empty password as an empty input field */
665
- @ <td><input type="password" autocomplete="off" name="pw"\
666
- @ value="" /></td>
669
+ @ <td><input aria-labelledby="supw" type="password" name="pw" \
670
+ @ autocomplete="off" value="" /></td>
667671
}
668672
@ </tr>
669673
}
670674
zGroup = login_group_name();
671675
if( zGroup ){
672676
--- src/setupuser.c
+++ src/setupuser.c
@@ -534,24 +534,27 @@
534 @ <input type="hidden" name="pw" value="*">
535 }
536 @ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))">
537 @ <table width="100%%">
538 @ <tr>
539 @ <td class="usetupEditLabel">User ID:</td>
540 if( uid ){
541 @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" />\
 
542 @ </td>
543 }else{
544 @ <td>(new user)<input type="hidden" name="id" value="0" /></td>
 
545 }
546 @ </tr>
547 @ <tr>
548 @ <td class="usetupEditLabel">Login:</td>
549 if( login_is_special(zLogin) ){
550 @ <td><b>%h(zLogin)</b></td>
551 }else{
552 @ <td><input type="text" name="login" value="%h(zLogin)" />\
 
553 if( alert_tables_exist() ){
554 int sid;
555 sid = db_int(0, "SELECT subscriberId FROM subscriber"
556 " WHERE suname=%Q", zLogin);
557 if( sid>0 ){
@@ -559,12 +562,13 @@
559 @ (subscription info for %h(zLogin))</a>\
560 }
561 }
562 @ </td></tr>
563 @ <tr>
564 @ <td class="usetupEditLabel">Contact&nbsp;Info:</td>
565 @ <td><textarea name="info" cols="40" rows="2">%h(zInfo)</textarea></td>
 
566 }
567 @ </tr>
568 @ <tr>
569 @ <td class="usetupEditLabel">Capabilities:</td>
570 @ <td width="100%%">
@@ -653,19 +657,19 @@
653 @ <a href="%R/setup_ucap_list">(key)</a>
654 @ </td>
655 @ </tr>
656 if( !login_is_special(zLogin) ){
657 @ <tr>
658 @ <td align="right">Password:</td>
659 if( zPw[0] ){
660 /* Obscure the password for all users */
661 @ <td><input type="password" autocomplete="off" name="pw"\
662 @ value="**********" /></td>
663 }else{
664 /* Show an empty password as an empty input field */
665 @ <td><input type="password" autocomplete="off" name="pw"\
666 @ value="" /></td>
667 }
668 @ </tr>
669 }
670 zGroup = login_group_name();
671 if( zGroup ){
672
--- src/setupuser.c
+++ src/setupuser.c
@@ -534,24 +534,27 @@
534 @ <input type="hidden" name="pw" value="*">
535 }
536 @ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))">
537 @ <table width="100%%">
538 @ <tr>
539 @ <td class="usetupEditLabel" id="suuid">User ID:</td>
540 if( uid ){
541 @ <td>%d(uid) <input aria-labelledby="suuid" type="hidden" \
542 @ name="id" value="%d(uid)"/>\
543 @ </td>
544 }else{
545 @ <td>(new user)<input aria-labelledby="suuid" type="hidden" name="id" \
546 @ value="0" /></td>
547 }
548 @ </tr>
549 @ <tr>
550 @ <td class="usetupEditLabel" id="sulgn">Login:</td>
551 if( login_is_special(zLogin) ){
552 @ <td><b>%h(zLogin)</b></td>
553 }else{
554 @ <td><input aria-labelledby="sulgn" type="text" name="login" \
555 @ value="%h(zLogin)" />
556 if( alert_tables_exist() ){
557 int sid;
558 sid = db_int(0, "SELECT subscriberId FROM subscriber"
559 " WHERE suname=%Q", zLogin);
560 if( sid>0 ){
@@ -559,12 +562,13 @@
562 @ (subscription info for %h(zLogin))</a>\
563 }
564 }
565 @ </td></tr>
566 @ <tr>
567 @ <td class="usetupEditLabel" id="sucnfo">Contact&nbsp;Info:</td>
568 @ <td><textarea aria-labelledby="sucnfo" name="info" cols="40" \
569 @ rows="2">%h(zInfo)</textarea></td>
570 }
571 @ </tr>
572 @ <tr>
573 @ <td class="usetupEditLabel">Capabilities:</td>
574 @ <td width="100%%">
@@ -653,19 +657,19 @@
657 @ <a href="%R/setup_ucap_list">(key)</a>
658 @ </td>
659 @ </tr>
660 if( !login_is_special(zLogin) ){
661 @ <tr>
662 @ <td align="right" id="supw">Password:</td>
663 if( zPw[0] ){
664 /* Obscure the password for all users */
665 @ <td><input aria-labelledby="supw" type="password" autocomplete="off" \
666 @ name="pw" value="**********" /></td>
667 }else{
668 /* Show an empty password as an empty input field */
669 @ <td><input aria-labelledby="supw" type="password" name="pw" \
670 @ autocomplete="off" value="" /></td>
671 }
672 @ </tr>
673 }
674 zGroup = login_group_name();
675 if( zGroup ){
676
+5 -2
--- src/shell.c
+++ src/shell.c
@@ -7998,13 +7998,16 @@
79987998
while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
79997999
/* int iId = sqlite3_column_int(pExplain, 0); */
80008000
/* int iParent = sqlite3_column_int(pExplain, 1); */
80018001
/* int iNotUsed = sqlite3_column_int(pExplain, 2); */
80028002
const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
8003
- int nDetail = STRLEN(zDetail);
8003
+ int nDetail;
80048004
int i;
80058005
8006
+ if( !zDetail ) continue;
8007
+ nDetail = STRLEN(zDetail);
8008
+
80068009
for(i=0; i<nDetail; i++){
80078010
const char *zIdx = 0;
80088011
if( memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
80098012
zIdx = &zDetail[i+13];
80108013
}else if( memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 ){
@@ -8820,11 +8823,11 @@
88208823
sqlite3_free(p->zCandidates);
88218824
sqlite3_free(p);
88228825
}
88238826
}
88248827
8825
-#endif /* ifndef SQLITE_OMIT_VIRTUAL_TABLE */
8828
+#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
88268829
88278830
/************************* End ../ext/expert/sqlite3expert.c ********************/
88288831
88298832
#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
88308833
/************************* Begin ../ext/misc/dbdata.c ******************/
88318834
--- src/shell.c
+++ src/shell.c
@@ -7998,13 +7998,16 @@
7998 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
7999 /* int iId = sqlite3_column_int(pExplain, 0); */
8000 /* int iParent = sqlite3_column_int(pExplain, 1); */
8001 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
8002 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
8003 int nDetail = STRLEN(zDetail);
8004 int i;
8005
 
 
 
8006 for(i=0; i<nDetail; i++){
8007 const char *zIdx = 0;
8008 if( memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
8009 zIdx = &zDetail[i+13];
8010 }else if( memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 ){
@@ -8820,11 +8823,11 @@
8820 sqlite3_free(p->zCandidates);
8821 sqlite3_free(p);
8822 }
8823 }
8824
8825 #endif /* ifndef SQLITE_OMIT_VIRTUAL_TABLE */
8826
8827 /************************* End ../ext/expert/sqlite3expert.c ********************/
8828
8829 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
8830 /************************* Begin ../ext/misc/dbdata.c ******************/
8831
--- src/shell.c
+++ src/shell.c
@@ -7998,13 +7998,16 @@
7998 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
7999 /* int iId = sqlite3_column_int(pExplain, 0); */
8000 /* int iParent = sqlite3_column_int(pExplain, 1); */
8001 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
8002 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
8003 int nDetail;
8004 int i;
8005
8006 if( !zDetail ) continue;
8007 nDetail = STRLEN(zDetail);
8008
8009 for(i=0; i<nDetail; i++){
8010 const char *zIdx = 0;
8011 if( memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
8012 zIdx = &zDetail[i+13];
8013 }else if( memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 ){
@@ -8820,11 +8823,11 @@
8823 sqlite3_free(p->zCandidates);
8824 sqlite3_free(p);
8825 }
8826 }
8827
8828 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
8829
8830 /************************* End ../ext/expert/sqlite3expert.c ********************/
8831
8832 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
8833 /************************* Begin ../ext/misc/dbdata.c ******************/
8834
+7 -2
--- src/skins.c
+++ src/skins.c
@@ -281,10 +281,13 @@
281281
** Return an identifier that is (probably) different for every skin
282282
** but that is (probably) the same if the skin is unchanged. This
283283
** identifier can be attached to resource URLs to force reloading when
284284
** the resources change but allow the resources to be read from cache
285285
** as long as they are unchanged.
286
+**
287
+** The zResource argument is the name of a CONFIG setting that
288
+** defines the resource. Examples: "css", "logo-image".
286289
*/
287290
unsigned int skin_id(const char *zResource){
288291
unsigned int h = 0;
289292
if( zAltSkinDir ){
290293
h = skin_hash(0, zAltSkinDir);
@@ -293,11 +296,13 @@
293296
}else{
294297
char *zMTime = db_get_mtime(zResource, 0, 0);
295298
h = skin_hash(0, zMTime);
296299
fossil_free(zMTime);
297300
}
298
- h = skin_hash(h, MANIFEST_UUID);
301
+
302
+ /* Change the ID every time Fossil is recompiled */
303
+ h = skin_hash(h, fossil_exe_id());
299304
return h;
300305
}
301306
302307
/*
303308
** For a skin named zSkinName, compute the name of the CONFIG table
@@ -1117,11 +1122,11 @@
11171122
if( !g.perm.Admin ){
11181123
@ <p>Only administrators are allowed to publish draft skins. Contact
11191124
@ an administrator to get this "draft%d(iSkin)" skin published.</p>
11201125
}else{
11211126
@ <p>When the draft%d(iSkin) skin is ready for production use,
1122
- @ make it the default scan by clicking the acknowledgements and
1127
+ @ make it the default skin by clicking the acknowledgements and
11231128
@ pressing the button below:</p>
11241129
@
11251130
@ <form method='POST' action='%R/setup_skin#step7'>
11261131
@ <p class='skinInput'>
11271132
@ <input type='hidden' name='sk' value='%d(iSkin)'>
11281133
--- src/skins.c
+++ src/skins.c
@@ -281,10 +281,13 @@
281 ** Return an identifier that is (probably) different for every skin
282 ** but that is (probably) the same if the skin is unchanged. This
283 ** identifier can be attached to resource URLs to force reloading when
284 ** the resources change but allow the resources to be read from cache
285 ** as long as they are unchanged.
 
 
 
286 */
287 unsigned int skin_id(const char *zResource){
288 unsigned int h = 0;
289 if( zAltSkinDir ){
290 h = skin_hash(0, zAltSkinDir);
@@ -293,11 +296,13 @@
293 }else{
294 char *zMTime = db_get_mtime(zResource, 0, 0);
295 h = skin_hash(0, zMTime);
296 fossil_free(zMTime);
297 }
298 h = skin_hash(h, MANIFEST_UUID);
 
 
299 return h;
300 }
301
302 /*
303 ** For a skin named zSkinName, compute the name of the CONFIG table
@@ -1117,11 +1122,11 @@
1117 if( !g.perm.Admin ){
1118 @ <p>Only administrators are allowed to publish draft skins. Contact
1119 @ an administrator to get this "draft%d(iSkin)" skin published.</p>
1120 }else{
1121 @ <p>When the draft%d(iSkin) skin is ready for production use,
1122 @ make it the default scan by clicking the acknowledgements and
1123 @ pressing the button below:</p>
1124 @
1125 @ <form method='POST' action='%R/setup_skin#step7'>
1126 @ <p class='skinInput'>
1127 @ <input type='hidden' name='sk' value='%d(iSkin)'>
1128
--- src/skins.c
+++ src/skins.c
@@ -281,10 +281,13 @@
281 ** Return an identifier that is (probably) different for every skin
282 ** but that is (probably) the same if the skin is unchanged. This
283 ** identifier can be attached to resource URLs to force reloading when
284 ** the resources change but allow the resources to be read from cache
285 ** as long as they are unchanged.
286 **
287 ** The zResource argument is the name of a CONFIG setting that
288 ** defines the resource. Examples: "css", "logo-image".
289 */
290 unsigned int skin_id(const char *zResource){
291 unsigned int h = 0;
292 if( zAltSkinDir ){
293 h = skin_hash(0, zAltSkinDir);
@@ -293,11 +296,13 @@
296 }else{
297 char *zMTime = db_get_mtime(zResource, 0, 0);
298 h = skin_hash(0, zMTime);
299 fossil_free(zMTime);
300 }
301
302 /* Change the ID every time Fossil is recompiled */
303 h = skin_hash(h, fossil_exe_id());
304 return h;
305 }
306
307 /*
308 ** For a skin named zSkinName, compute the name of the CONFIG table
@@ -1117,11 +1122,11 @@
1122 if( !g.perm.Admin ){
1123 @ <p>Only administrators are allowed to publish draft skins. Contact
1124 @ an administrator to get this "draft%d(iSkin)" skin published.</p>
1125 }else{
1126 @ <p>When the draft%d(iSkin) skin is ready for production use,
1127 @ make it the default skin by clicking the acknowledgements and
1128 @ pressing the button below:</p>
1129 @
1130 @ <form method='POST' action='%R/setup_skin#step7'>
1131 @ <p class='skinInput'>
1132 @ <input type='hidden' name='sk' value='%d(iSkin)'>
1133
+136 -62
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -1162,11 +1162,11 @@
11621162
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
11631163
** [sqlite_version()] and [sqlite_source_id()].
11641164
*/
11651165
#define SQLITE_VERSION "3.32.0"
11661166
#define SQLITE_VERSION_NUMBER 3032000
1167
-#define SQLITE_SOURCE_ID "2020-05-08 19:02:21 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff"
1167
+#define SQLITE_SOURCE_ID "2020-05-17 13:47:28 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece"
11681168
11691169
/*
11701170
** CAPI3REF: Run-Time Library Version Numbers
11711171
** KEYWORDS: sqlite3_version sqlite3_sourceid
11721172
**
@@ -6532,11 +6532,11 @@
65326532
** when first called if N is less than or equal to zero or if a memory
65336533
** allocate error occurs.
65346534
**
65356535
** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
65366536
** determined by the N parameter on first successful call. Changing the
6537
-** value of N in any subsequents call to sqlite3_aggregate_context() within
6537
+** value of N in any subsequent call to sqlite3_aggregate_context() within
65386538
** the same aggregate function instance will not resize the memory
65396539
** allocation.)^ Within the xFinal callback, it is customary to set
65406540
** N=0 in calls to sqlite3_aggregate_context(C,N) so that no
65416541
** pointless memory allocations occur.
65426542
**
@@ -17119,11 +17119,11 @@
1711917119
#define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */
1712017120
#define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/
1712117121
#define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */
1712217122
#define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */
1712317123
#define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */
17124
-#define SQLITE_FUNC_COALESCE 0x0200 /* Built-in coalesce() or ifnull() */
17124
+/* 0x0200 -- available for reuse */
1712517125
#define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */
1712617126
#define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */
1712717127
#define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */
1712817128
#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a
1712917129
** single query - might change over time */
@@ -17140,10 +17140,11 @@
1714017140
#define INLINEFUNC_coalesce 0
1714117141
#define INLINEFUNC_implies_nonnull_row 1
1714217142
#define INLINEFUNC_expr_implies_expr 2
1714317143
#define INLINEFUNC_expr_compare 3
1714417144
#define INLINEFUNC_affinity 4
17145
+#define INLINEFUNC_iif 5
1714517146
#define INLINEFUNC_unlikely 99 /* Default case */
1714617147
1714717148
/*
1714817149
** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
1714917150
** used to create the initializers for the FuncDef structures.
@@ -20064,12 +20065,14 @@
2006420065
# define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
2006520066
#endif
2006620067
SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db);
2006720068
#ifndef SQLITE_OMIT_VIRTUALTABLE
2006820069
SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName);
20070
+SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3*,Table*,const char*);
2006920071
#else
2007020072
# define sqlite3ShadowTableName(A,B) 0
20073
+# define sqlite3IsShadowTableOf(A,B,C) 0
2007120074
#endif
2007220075
SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*);
2007320076
SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*);
2007420077
SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*);
2007520078
SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int);
@@ -27924,11 +27927,11 @@
2792427927
}
2792527928
}else{
2792627929
assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
2792727930
assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
2792827931
sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
27929
- pNew = sqlite3_realloc64(p, n);
27932
+ pNew = sqlite3Realloc(p, n);
2793027933
if( !pNew ){
2793127934
sqlite3OomFault(db);
2793227935
}
2793327936
sqlite3MemdebugSetType(pNew,
2793427937
(db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
@@ -29001,11 +29004,11 @@
2900129004
p->nAlloc = (int)szNew;
2900229005
}
2900329006
if( p->db ){
2900429007
zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc);
2900529008
}else{
29006
- zNew = sqlite3_realloc64(zOld, p->nAlloc);
29009
+ zNew = sqlite3Realloc(zOld, p->nAlloc);
2900729010
}
2900829011
if( zNew ){
2900929012
assert( p->zText!=0 || p->nChar==0 );
2901029013
if( !isMalloced(p) && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar);
2901129014
p->zText = zNew;
@@ -29343,11 +29346,11 @@
2934329346
** and segfaults if you give it a long long int.
2934429347
*/
2934529348
SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){
2934629349
va_list ap;
2934729350
StrAccum acc;
29348
- char zBuf[500];
29351
+ char zBuf[SQLITE_PRINT_BUF_SIZE*10];
2934929352
sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
2935029353
va_start(ap,zFormat);
2935129354
sqlite3_str_vappendf(&acc, zFormat, ap);
2935229355
va_end(ap);
2935329356
sqlite3StrAccumFinish(&acc);
@@ -45048,10 +45051,11 @@
4504845051
}
4504945052
4505045053
/* Forward references to VFS helper methods used for temporary files */
4505145054
static int winGetTempname(sqlite3_vfs *, char **);
4505245055
static int winIsDir(const void *);
45056
+static BOOL winIsLongPathPrefix(const char *);
4505345057
static BOOL winIsDriveLetterAndColon(const char *);
4505445058
4505545059
/*
4505645060
** Control and query of the open file handle.
4505745061
*/
@@ -47026,10 +47030,21 @@
4702647030
*pResOut = rc;
4702747031
OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n",
4702847032
zFilename, pResOut, *pResOut));
4702947033
return SQLITE_OK;
4703047034
}
47035
+
47036
+/*
47037
+** Returns non-zero if the specified path name starts with the "long path"
47038
+** prefix.
47039
+*/
47040
+static BOOL winIsLongPathPrefix(
47041
+ const char *zPathname
47042
+){
47043
+ return ( zPathname[0]=='\\' && zPathname[1]=='\\'
47044
+ && zPathname[2]=='?' && zPathname[3]=='\\' );
47045
+}
4703147046
4703247047
/*
4703347048
** Returns non-zero if the specified path name starts with a drive letter
4703447049
** followed by a colon character.
4703547050
*/
@@ -47091,14 +47106,15 @@
4709147106
DWORD nByte;
4709247107
void *zConverted;
4709347108
char *zOut;
4709447109
#endif
4709547110
47096
- /* If this path name begins with "/X:", where "X" is any alphabetic
47097
- ** character, discard the initial "/" from the pathname.
47111
+ /* If this path name begins with "/X:" or "\\?\", where "X" is any
47112
+ ** alphabetic character, discard the initial "/" from the pathname.
4709847113
*/
47099
- if( zRelative[0]=='/' && winIsDriveLetterAndColon(zRelative+1) ){
47114
+ if( zRelative[0]=='/' && (winIsDriveLetterAndColon(zRelative+1)
47115
+ || winIsLongPathPrefix(zRelative+1)) ){
4710047116
zRelative++;
4710147117
}
4710247118
4710347119
#if defined(__CYGWIN__)
4710447120
SimulateIOError( return SQLITE_ERROR );
@@ -47850,11 +47866,11 @@
4785047866
if( newSz>p->szMax ){
4785147867
return SQLITE_FULL;
4785247868
}
4785347869
newSz *= 2;
4785447870
if( newSz>p->szMax ) newSz = p->szMax;
47855
- pNew = sqlite3_realloc64(p->aData, newSz);
47871
+ pNew = sqlite3Realloc(p->aData, newSz);
4785647872
if( pNew==0 ) return SQLITE_NOMEM;
4785747873
p->aData = pNew;
4785847874
p->szAlloc = newSz;
4785947875
return SQLITE_OK;
4786047876
}
@@ -59820,11 +59836,11 @@
5982059836
5982159837
/* Enlarge the pWal->apWiData[] array if required */
5982259838
if( pWal->nWiData<=iPage ){
5982359839
sqlite3_int64 nByte = sizeof(u32*)*(iPage+1);
5982459840
volatile u32 **apNew;
59825
- apNew = (volatile u32 **)sqlite3_realloc64((void *)pWal->apWiData, nByte);
59841
+ apNew = (volatile u32 **)sqlite3Realloc((void *)pWal->apWiData, nByte);
5982659842
if( !apNew ){
5982759843
*ppPage = 0;
5982859844
return SQLITE_NOMEM_BKPT;
5982959845
}
5983059846
memset((void*)&apNew[pWal->nWiData], 0,
@@ -61074,11 +61090,11 @@
6107461090
pWal->nCkpt++;
6107561091
pWal->hdr.mxFrame = 0;
6107661092
sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0]));
6107761093
memcpy(&pWal->hdr.aSalt[1], &salt1, 4);
6107861094
walIndexWriteHdr(pWal);
61079
- pInfo->nBackfill = 0;
61095
+ AtomicStore(&pInfo->nBackfill, 0);
6108061096
pInfo->nBackfillAttempted = 0;
6108161097
pInfo->aReadMark[1] = 0;
6108261098
for(i=2; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED;
6108361099
assert( pInfo->aReadMark[0]==0 );
6108461100
}
@@ -61248,11 +61264,11 @@
6124861264
if( rc==SQLITE_OK ){
6124961265
rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags));
6125061266
}
6125161267
}
6125261268
if( rc==SQLITE_OK ){
61253
- pInfo->nBackfill = mxSafeFrame;
61269
+ AtomicStore(&pInfo->nBackfill, mxSafeFrame);
6125461270
}
6125561271
}
6125661272
6125761273
/* Release the reader lock held while backfilling */
6125861274
walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1);
@@ -61871,11 +61887,11 @@
6187161887
}
6187261888
6187361889
assert( pWal->nWiData>0 );
6187461890
assert( pWal->apWiData[0]!=0 );
6187561891
pInfo = walCkptInfo(pWal);
61876
- if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame
61892
+ if( !useWal && AtomicLoad(&pInfo->nBackfill)==pWal->hdr.mxFrame
6187761893
#ifdef SQLITE_ENABLE_SNAPSHOT
6187861894
&& (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0)
6187961895
#endif
6188061896
){
6188161897
/* The WAL has been completely backfilled (or it is empty).
@@ -62038,11 +62054,11 @@
6203862054
void *pBuf2 = sqlite3_malloc(szPage);
6203962055
if( pBuf1==0 || pBuf2==0 ){
6204062056
rc = SQLITE_NOMEM;
6204162057
}else{
6204262058
u32 i = pInfo->nBackfillAttempted;
62043
- for(i=pInfo->nBackfillAttempted; i>pInfo->nBackfill; i--){
62059
+ for(i=pInfo->nBackfillAttempted; i>AtomicLoad(&pInfo->nBackfill); i--){
6204462060
WalHashLoc sLoc; /* Hash table location */
6204562061
u32 pgno; /* Page number in db file */
6204662062
i64 iDbOff; /* Offset of db file entry */
6204762063
i64 iWalOff; /* Offset of wal file entry */
6204862064
@@ -79307,10 +79323,11 @@
7930779323
char *zP4;
7930879324
char *zCom;
7930979325
sqlite3 dummyDb;
7931079326
static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n";
7931179327
if( pOut==0 ) pOut = stdout;
79328
+ sqlite3BeginBenignMalloc();
7931279329
dummyDb.mallocFailed = 1;
7931379330
zP4 = sqlite3VdbeDisplayP4(&dummyDb, pOp);
7931479331
#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
7931579332
zCom = sqlite3VdbeDisplayComment(0, pOp, zP4);
7931679333
#else
@@ -79325,10 +79342,11 @@
7932579342
zCom ? zCom : ""
7932679343
);
7932779344
fflush(pOut);
7932879345
sqlite3_free(zP4);
7932979346
sqlite3_free(zCom);
79347
+ sqlite3EndBenignMalloc();
7933079348
}
7933179349
#endif
7933279350
7933379351
/*
7933479352
** Initialize an array of N Mem element.
@@ -84066,11 +84084,11 @@
8406684084
p->db->errCode = SQLITE_OK;
8406784085
8406884086
/* If the bit corresponding to this variable in Vdbe.expmask is set, then
8406984087
** binding a new value to this variable invalidates the current query plan.
8407084088
**
84071
- ** IMPLEMENTATION-OF: R-48440-37595 If the specific value bound to host
84089
+ ** IMPLEMENTATION-OF: R-57496-20354 If the specific value bound to a host
8407284090
** parameter in the WHERE clause might influence the choice of query plan
8407384091
** for a statement, then the statement will be automatically recompiled,
8407484092
** as if there had been a schema change, on the first sqlite3_step() call
8407584093
** following any change to the bindings of that parameter.
8407684094
*/
@@ -96365,12 +96383,12 @@
9636596383
*************************************************************************
9636696384
**
9636796385
** This file implements virtual-tables for examining the bytecode content
9636896386
** of a prepared statement.
9636996387
*/
96370
-#ifdef SQLITE_ENABLE_BYTECODE_VTAB
9637196388
/* #include "sqliteInt.h" */
96389
+#if defined(SQLITE_ENABLE_BYTECODE_VTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
9637296390
/* #include "vdbeInt.h" */
9637396391
9637496392
/* An instance of the bytecode() table-valued function.
9637596393
*/
9637696394
typedef struct bytecodevtab bytecodevtab;
@@ -96771,10 +96789,12 @@
9677196789
if( rc==SQLITE_OK ){
9677296790
rc = sqlite3_create_module(db, "tables_used", &bytecodevtabModule, &db);
9677396791
}
9677496792
return rc;
9677596793
}
96794
+#elif defined(SQLITE_ENABLE_BYTECODE_VTAB)
96795
+SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ return SQLITE_OK; }
9677696796
#endif /* SQLITE_ENABLE_BYTECODE_VTAB */
9677796797
9677896798
/************** End of vdbevtab.c ********************************************/
9677996799
/************** Begin file memjournal.c **************************************/
9678096800
/*
@@ -103075,10 +103095,17 @@
103075103095
}
103076103096
setDoNotMergeFlagOnCopy(v);
103077103097
sqlite3VdbeResolveLabel(v, endCoalesce);
103078103098
break;
103079103099
}
103100
+ case INLINEFUNC_iif: {
103101
+ Expr caseExpr;
103102
+ memset(&caseExpr, 0, sizeof(caseExpr));
103103
+ caseExpr.op = TK_CASE;
103104
+ caseExpr.x.pList = pFarg;
103105
+ return sqlite3ExprCodeTarget(pParse, &caseExpr, target);
103106
+ }
103080103107
103081103108
default: {
103082103109
/* The UNLIKELY() function is a no-op. The result is the value
103083103110
** of the first argument.
103084103111
*/
@@ -105497,11 +105524,14 @@
105497105524
if( !zName ) goto exit_rename_table;
105498105525
105499105526
/* Check that a table or index named 'zName' does not already exist
105500105527
** in database iDb. If so, this is an error.
105501105528
*/
105502
- if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){
105529
+ if( sqlite3FindTable(db, zName, zDb)
105530
+ || sqlite3FindIndex(db, zName, zDb)
105531
+ || sqlite3IsShadowTableOf(db, pTab, zName)
105532
+ ){
105503105533
sqlite3ErrorMsg(pParse,
105504105534
"there is already another table or index with this name: %s", zName);
105505105535
goto exit_rename_table;
105506105536
}
105507105537
@@ -110244,26 +110274,43 @@
110244110274
** exists */
110245110275
if( db->auth.authLevel<UAUTH_Admin && sqlite3UserAuthTable(zName)!=0 ){
110246110276
return 0;
110247110277
}
110248110278
#endif
110249
- while(1){
110250
- for(i=OMIT_TEMPDB; i<db->nDb; i++){
110251
- int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
110252
- if( zDatabase==0 || sqlite3DbIsNamed(db, j, zDatabase) ){
110253
- assert( sqlite3SchemaMutexHeld(db, j, 0) );
110254
- p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName);
110255
- if( p ) return p;
110256
- }
110257
- }
110258
- /* Not found. If the name we were looking for was temp.sqlite_master
110259
- ** then change the name to sqlite_temp_master and try again. */
110260
- if( sqlite3StrICmp(zName, MASTER_NAME)!=0 ) break;
110261
- if( sqlite3_stricmp(zDatabase, db->aDb[1].zDbSName)!=0 ) break;
110262
- zName = TEMP_MASTER_NAME;
110263
- }
110264
- return 0;
110279
+ if( zDatabase ){
110280
+ for(i=0; i<db->nDb; i++){
110281
+ if( sqlite3StrICmp(zDatabase, db->aDb[i].zDbSName)==0 ) break;
110282
+ }
110283
+ if( i>=db->nDb ){
110284
+ /* No match against the official names. But always match "main"
110285
+ ** to schema 0 as a legacy fallback. */
110286
+ if( sqlite3StrICmp(zDatabase,"main")==0 ){
110287
+ i = 0;
110288
+ }else{
110289
+ return 0;
110290
+ }
110291
+ }
110292
+ p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName);
110293
+ if( p==0 && i==1 && sqlite3StrICmp(zName, MASTER_NAME)==0 ){
110294
+ /* All temp.sqlite_master to be an alias for sqlite_temp_master */
110295
+ p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, TEMP_MASTER_NAME);
110296
+ }
110297
+ }else{
110298
+ /* Match against TEMP first */
110299
+ p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, zName);
110300
+ if( p ) return p;
110301
+ /* The main database is second */
110302
+ p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, zName);
110303
+ if( p ) return p;
110304
+ /* Attached databases are in order of attachment */
110305
+ for(i=2; i<db->nDb; i++){
110306
+ assert( sqlite3SchemaMutexHeld(db, i, 0) );
110307
+ p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName);
110308
+ if( p ) break;
110309
+ }
110310
+ }
110311
+ return p;
110265110312
}
110266110313
110267110314
/*
110268110315
** Locate the in-memory structure that describes a particular database
110269110316
** table given the name of that table and (optionally) the name of the
@@ -112063,10 +112110,32 @@
112063112110
assert( pPk->nColumn==j );
112064112111
assert( pTab->nNVCol<=j );
112065112112
recomputeColumnsNotIndexed(pPk);
112066112113
}
112067112114
112115
+
112116
+#ifndef SQLITE_OMIT_VIRTUALTABLE
112117
+/*
112118
+** Return true if pTab is a virtual table and zName is a shadow table name
112119
+** for that virtual table.
112120
+*/
112121
+SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *zName){
112122
+ int nName; /* Length of zName */
112123
+ Module *pMod; /* Module for the virtual table */
112124
+
112125
+ if( !IsVirtual(pTab) ) return 0;
112126
+ nName = sqlite3Strlen30(pTab->zName);
112127
+ if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0;
112128
+ if( zName[nName]!='_' ) return 0;
112129
+ pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]);
112130
+ if( pMod==0 ) return 0;
112131
+ if( pMod->pModule->iVersion<3 ) return 0;
112132
+ if( pMod->pModule->xShadowName==0 ) return 0;
112133
+ return pMod->pModule->xShadowName(zName+nName+1);
112134
+}
112135
+#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
112136
+
112068112137
#ifndef SQLITE_OMIT_VIRTUALTABLE
112069112138
/*
112070112139
** Return true if zName is a shadow table name in the current database
112071112140
** connection.
112072112141
**
@@ -112074,26 +112143,21 @@
112074112143
** restored to its original value prior to this routine returning.
112075112144
*/
112076112145
SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){
112077112146
char *zTail; /* Pointer to the last "_" in zName */
112078112147
Table *pTab; /* Table that zName is a shadow of */
112079
- Module *pMod; /* Module for the virtual table */
112080
-
112081112148
zTail = strrchr(zName, '_');
112082112149
if( zTail==0 ) return 0;
112083112150
*zTail = 0;
112084112151
pTab = sqlite3FindTable(db, zName, 0);
112085112152
*zTail = '_';
112086112153
if( pTab==0 ) return 0;
112087112154
if( !IsVirtual(pTab) ) return 0;
112088
- pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]);
112089
- if( pMod==0 ) return 0;
112090
- if( pMod->pModule->iVersion<3 ) return 0;
112091
- if( pMod->pModule->xShadowName==0 ) return 0;
112092
- return pMod->pModule->xShadowName(zTail+1);
112155
+ return sqlite3IsShadowTableOf(db, pTab, zName);
112093112156
}
112094112157
#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
112158
+
112095112159
112096112160
#ifdef SQLITE_DEBUG
112097112161
/*
112098112162
** Mark all nodes of an expression as EP_Immutable, indicating that
112099112163
** they should not be changed. Expressions attached to a table or
@@ -117780,11 +117844,11 @@
117780117844
if( (cntExpand&(cntExpand-1))==0 ){
117781117845
/* Grow the size of the output buffer only on substitutions
117782117846
** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */
117783117847
u8 *zOld;
117784117848
zOld = zOut;
117785
- zOut = sqlite3_realloc64(zOut, (int)nOut + (nOut - nStr - 1));
117849
+ zOut = sqlite3Realloc(zOut, (int)nOut + (nOut - nStr - 1));
117786117850
if( zOut==0 ){
117787117851
sqlite3_result_error_nomem(context);
117788117852
sqlite3_free(zOld);
117789117853
return;
117790117854
}
@@ -118477,11 +118541,11 @@
118477118541
FUNCTION(round, 2, 0, 0, roundFunc ),
118478118542
#endif
118479118543
FUNCTION(upper, 1, 0, 0, upperFunc ),
118480118544
FUNCTION(lower, 1, 0, 0, lowerFunc ),
118481118545
FUNCTION(hex, 1, 0, 0, hexFunc ),
118482
- INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE),
118546
+ INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, 0 ),
118483118547
VFUNCTION(random, 0, 0, 0, randomFunc ),
118484118548
VFUNCTION(randomblob, 1, 0, 0, randomBlob ),
118485118549
FUNCTION(nullif, 2, 0, 1, nullifFunc ),
118486118550
DFUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
118487118551
DFUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
@@ -118517,11 +118581,12 @@
118517118581
#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
118518118582
FUNCTION(unknown, -1, 0, 0, unknownFunc ),
118519118583
#endif
118520118584
FUNCTION(coalesce, 1, 0, 0, 0 ),
118521118585
FUNCTION(coalesce, 0, 0, 0, 0 ),
118522
- INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE),
118586
+ INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, 0 ),
118587
+ INLINE_FUNC(iif, 3, INLINEFUNC_iif, 0 ),
118523118588
};
118524118589
#ifndef SQLITE_OMIT_ALTERTABLE
118525118590
sqlite3AlterFunctions();
118526118591
#endif
118527118592
sqlite3WindowFunctions();
@@ -135570,11 +135635,11 @@
135570135635
need = nCol;
135571135636
}
135572135637
if( p->nData + need > p->nAlloc ){
135573135638
char **azNew;
135574135639
p->nAlloc = p->nAlloc*2 + need;
135575
- azNew = sqlite3_realloc64( p->azResult, sizeof(char*)*p->nAlloc );
135640
+ azNew = sqlite3Realloc( p->azResult, sizeof(char*)*p->nAlloc );
135576135641
if( azNew==0 ) goto malloc_failed;
135577135642
p->azResult = azNew;
135578135643
}
135579135644
135580135645
/* If this is the first row, then generate an extra row containing
@@ -135679,11 +135744,11 @@
135679135744
sqlite3_free_table(&res.azResult[1]);
135680135745
return rc;
135681135746
}
135682135747
if( res.nAlloc>res.nData ){
135683135748
char **azNew;
135684
- azNew = sqlite3_realloc64( res.azResult, sizeof(char*)*res.nData );
135749
+ azNew = sqlite3Realloc( res.azResult, sizeof(char*)*res.nData );
135685135750
if( azNew==0 ){
135686135751
sqlite3_free_table(&res.azResult[1]);
135687135752
db->errCode = SQLITE_NOMEM;
135688135753
return SQLITE_NOMEM_BKPT;
135689135754
}
@@ -136969,14 +137034,14 @@
136969137034
** Therefore, the P4 parameter is only required if the default value for
136970137035
** the column is a literal number, string or null. The sqlite3ValueFromExpr()
136971137036
** function is capable of transforming these types of expressions into
136972137037
** sqlite3_value objects.
136973137038
**
136974
-** If parameter iReg is not negative, code an OP_RealAffinity instruction
136975
-** on register iReg. This is used when an equivalent integer value is
136976
-** stored in place of an 8-byte floating point value in order to save
136977
-** space.
137039
+** If column as REAL affinity and the table is an ordinary b-tree table
137040
+** (not a virtual table) then the value might have been stored as an
137041
+** integer. In that case, add an OP_RealAffinity opcode to make sure
137042
+** it has been converted into REAL.
136978137043
*/
136979137044
SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
136980137045
assert( pTab!=0 );
136981137046
if( !pTab->pSelect ){
136982137047
sqlite3_value *pValue = 0;
@@ -136989,11 +137054,11 @@
136989137054
if( pValue ){
136990137055
sqlite3VdbeAppendP4(v, pValue, P4_MEM);
136991137056
}
136992137057
}
136993137058
#ifndef SQLITE_OMIT_FLOATING_POINT
136994
- if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){
137059
+ if( pTab->aCol[i].affinity==SQLITE_AFF_REAL && !IsVirtual(pTab) ){
136995137060
sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
136996137061
}
136997137062
#endif
136998137063
}
136999137064
@@ -139838,11 +139903,11 @@
139838139903
assert( IsVirtual(pTab) );
139839139904
for(i=0; i<pToplevel->nVtabLock; i++){
139840139905
if( pTab==pToplevel->apVtabLock[i] ) return;
139841139906
}
139842139907
n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]);
139843
- apVtabLock = sqlite3_realloc64(pToplevel->apVtabLock, n);
139908
+ apVtabLock = sqlite3Realloc(pToplevel->apVtabLock, n);
139844139909
if( apVtabLock ){
139845139910
pToplevel->apVtabLock = apVtabLock;
139846139911
pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab;
139847139912
}else{
139848139913
sqlite3OomFault(pToplevel->db);
@@ -151130,17 +151195,23 @@
151130151195
){
151131151196
if( pAppend ){
151132151197
int i;
151133151198
int nInit = pList ? pList->nExpr : 0;
151134151199
for(i=0; i<pAppend->nExpr; i++){
151135
- int iDummy;
151136151200
Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0);
151137151201
assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) );
151138
- if( bIntToNull && pDup && sqlite3ExprIsInteger(pDup, &iDummy) ){
151139
- pDup->op = TK_NULL;
151140
- pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse);
151141
- pDup->u.zToken = 0;
151202
+ if( bIntToNull && pDup ){
151203
+ int iDummy;
151204
+ Expr *pSub;
151205
+ for(pSub=pDup; ExprHasProperty(pSub, EP_Skip); pSub=pSub->pLeft){
151206
+ assert( pSub );
151207
+ }
151208
+ if( sqlite3ExprIsInteger(pSub, &iDummy) ){
151209
+ pSub->op = TK_NULL;
151210
+ pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse);
151211
+ pSub->u.zToken = 0;
151212
+ }
151142151213
}
151143151214
pList = sqlite3ExprListAppend(pParse, pList, pDup);
151144151215
if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags;
151145151216
}
151146151217
}
@@ -160322,10 +160393,11 @@
160322160393
}
160323160394
#endif
160324160395
if( rc==SQLITE_OK ){
160325160396
sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage,
160326160397
sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage);
160398
+ sqlite3MemoryBarrier();
160327160399
sqlite3GlobalConfig.isInit = 1;
160328160400
#ifdef SQLITE_EXTRA_INIT
160329160401
bRunExtraInit = 1;
160330160402
#endif
160331160403
}
@@ -163270,11 +163342,11 @@
163270163342
assert( SQLITE_OPEN_CREATE == 0x04 );
163271163343
testcase( (1<<(flags&7))==0x02 ); /* READONLY */
163272163344
testcase( (1<<(flags&7))==0x04 ); /* READWRITE */
163273163345
testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */
163274163346
if( ((1<<(flags&7)) & 0x46)==0 ){
163275
- rc = SQLITE_MISUSE_BKPT; /* IMP: R-65497-44594 */
163347
+ rc = SQLITE_MISUSE_BKPT; /* IMP: R-18321-05872 */
163276163348
}else{
163277163349
rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg);
163278163350
}
163279163351
if( rc!=SQLITE_OK ){
163280163352
if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
@@ -171194,10 +171266,11 @@
171194171266
while( *pRc==SQLITE_OK && pLeft->bEof==0 ){
171195171267
memset(pDl->pList, 0, pDl->nList);
171196171268
fts3EvalNextRow(pCsr, pLeft, pRc);
171197171269
}
171198171270
}
171271
+ pRight->bEof = pLeft->bEof = 1;
171199171272
}
171200171273
}
171201171274
break;
171202171275
}
171203171276
@@ -182739,11 +182812,11 @@
182739182812
iStart = pExpr->iPhrase * p->nCol;
182740182813
}else{
182741182814
iStart = pExpr->iPhrase * ((p->nCol + 31) / 32);
182742182815
}
182743182816
182744
- while( 1 ){
182817
+ if( pIter ) while( 1 ){
182745182818
int nHit = fts3ColumnlistCount(&pIter);
182746182819
if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){
182747182820
if( p->flag==FTS3_MATCHINFO_LHITS ){
182748182821
p->aMatchinfo[iStart + iCol] = (u32)nHit;
182749182822
}else if( nHit ){
@@ -184653,10 +184726,11 @@
184653184726
}
184654184727
184655184728
/* Append N bytes from zIn onto the end of the JsonString string.
184656184729
*/
184657184730
static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){
184731
+ if( N==0 ) return;
184658184732
if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return;
184659184733
memcpy(p->zBuf+p->nUsed, zIn, N);
184660184734
p->nUsed += N;
184661184735
}
184662184736
@@ -224664,11 +224738,11 @@
224664224738
int nArg, /* Number of args */
224665224739
sqlite3_value **apUnused /* Function arguments */
224666224740
){
224667224741
assert( nArg==0 );
224668224742
UNUSED_PARAM2(nArg, apUnused);
224669
- sqlite3_result_text(pCtx, "fts5: 2020-05-08 19:02:21 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff", -1, SQLITE_TRANSIENT);
224743
+ sqlite3_result_text(pCtx, "fts5: 2020-05-17 00:26:44 1313557b512297e7b75ed748894379b2022aecf696d5a58318e46a668321c1ff", -1, SQLITE_TRANSIENT);
224670224744
}
224671224745
224672224746
/*
224673224747
** Return true if zName is the extension on one of the shadow tables used
224674224748
** by this module.
@@ -229447,12 +229521,12 @@
229447229521
}
229448229522
#endif /* SQLITE_CORE */
229449229523
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
229450229524
229451229525
/************** End of stmt.c ************************************************/
229452
-#if __LINE__!=229452
229526
+#if __LINE__!=229526
229453229527
#undef SQLITE_SOURCE_ID
229454
-#define SQLITE_SOURCE_ID "2020-05-08 19:02:21 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f96alt2"
229528
+#define SQLITE_SOURCE_ID "2020-05-17 13:47:28 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469falt2"
229455229529
#endif
229456229530
/* Return the source-id for this library */
229457229531
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
229458229532
/************************** End of sqlite3.c ******************************/
229459229533
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -1162,11 +1162,11 @@
1162 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
1163 ** [sqlite_version()] and [sqlite_source_id()].
1164 */
1165 #define SQLITE_VERSION "3.32.0"
1166 #define SQLITE_VERSION_NUMBER 3032000
1167 #define SQLITE_SOURCE_ID "2020-05-08 19:02:21 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff"
1168
1169 /*
1170 ** CAPI3REF: Run-Time Library Version Numbers
1171 ** KEYWORDS: sqlite3_version sqlite3_sourceid
1172 **
@@ -6532,11 +6532,11 @@
6532 ** when first called if N is less than or equal to zero or if a memory
6533 ** allocate error occurs.
6534 **
6535 ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
6536 ** determined by the N parameter on first successful call. Changing the
6537 ** value of N in any subsequents call to sqlite3_aggregate_context() within
6538 ** the same aggregate function instance will not resize the memory
6539 ** allocation.)^ Within the xFinal callback, it is customary to set
6540 ** N=0 in calls to sqlite3_aggregate_context(C,N) so that no
6541 ** pointless memory allocations occur.
6542 **
@@ -17119,11 +17119,11 @@
17119 #define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */
17120 #define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/
17121 #define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */
17122 #define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */
17123 #define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */
17124 #define SQLITE_FUNC_COALESCE 0x0200 /* Built-in coalesce() or ifnull() */
17125 #define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */
17126 #define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */
17127 #define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */
17128 #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a
17129 ** single query - might change over time */
@@ -17140,10 +17140,11 @@
17140 #define INLINEFUNC_coalesce 0
17141 #define INLINEFUNC_implies_nonnull_row 1
17142 #define INLINEFUNC_expr_implies_expr 2
17143 #define INLINEFUNC_expr_compare 3
17144 #define INLINEFUNC_affinity 4
 
17145 #define INLINEFUNC_unlikely 99 /* Default case */
17146
17147 /*
17148 ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
17149 ** used to create the initializers for the FuncDef structures.
@@ -20064,12 +20065,14 @@
20064 # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
20065 #endif
20066 SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db);
20067 #ifndef SQLITE_OMIT_VIRTUALTABLE
20068 SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName);
 
20069 #else
20070 # define sqlite3ShadowTableName(A,B) 0
 
20071 #endif
20072 SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*);
20073 SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*);
20074 SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*);
20075 SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int);
@@ -27924,11 +27927,11 @@
27924 }
27925 }else{
27926 assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
27927 assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
27928 sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
27929 pNew = sqlite3_realloc64(p, n);
27930 if( !pNew ){
27931 sqlite3OomFault(db);
27932 }
27933 sqlite3MemdebugSetType(pNew,
27934 (db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
@@ -29001,11 +29004,11 @@
29001 p->nAlloc = (int)szNew;
29002 }
29003 if( p->db ){
29004 zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc);
29005 }else{
29006 zNew = sqlite3_realloc64(zOld, p->nAlloc);
29007 }
29008 if( zNew ){
29009 assert( p->zText!=0 || p->nChar==0 );
29010 if( !isMalloced(p) && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar);
29011 p->zText = zNew;
@@ -29343,11 +29346,11 @@
29343 ** and segfaults if you give it a long long int.
29344 */
29345 SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){
29346 va_list ap;
29347 StrAccum acc;
29348 char zBuf[500];
29349 sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
29350 va_start(ap,zFormat);
29351 sqlite3_str_vappendf(&acc, zFormat, ap);
29352 va_end(ap);
29353 sqlite3StrAccumFinish(&acc);
@@ -45048,10 +45051,11 @@
45048 }
45049
45050 /* Forward references to VFS helper methods used for temporary files */
45051 static int winGetTempname(sqlite3_vfs *, char **);
45052 static int winIsDir(const void *);
 
45053 static BOOL winIsDriveLetterAndColon(const char *);
45054
45055 /*
45056 ** Control and query of the open file handle.
45057 */
@@ -47026,10 +47030,21 @@
47026 *pResOut = rc;
47027 OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n",
47028 zFilename, pResOut, *pResOut));
47029 return SQLITE_OK;
47030 }
 
 
 
 
 
 
 
 
 
 
 
47031
47032 /*
47033 ** Returns non-zero if the specified path name starts with a drive letter
47034 ** followed by a colon character.
47035 */
@@ -47091,14 +47106,15 @@
47091 DWORD nByte;
47092 void *zConverted;
47093 char *zOut;
47094 #endif
47095
47096 /* If this path name begins with "/X:", where "X" is any alphabetic
47097 ** character, discard the initial "/" from the pathname.
47098 */
47099 if( zRelative[0]=='/' && winIsDriveLetterAndColon(zRelative+1) ){
 
47100 zRelative++;
47101 }
47102
47103 #if defined(__CYGWIN__)
47104 SimulateIOError( return SQLITE_ERROR );
@@ -47850,11 +47866,11 @@
47850 if( newSz>p->szMax ){
47851 return SQLITE_FULL;
47852 }
47853 newSz *= 2;
47854 if( newSz>p->szMax ) newSz = p->szMax;
47855 pNew = sqlite3_realloc64(p->aData, newSz);
47856 if( pNew==0 ) return SQLITE_NOMEM;
47857 p->aData = pNew;
47858 p->szAlloc = newSz;
47859 return SQLITE_OK;
47860 }
@@ -59820,11 +59836,11 @@
59820
59821 /* Enlarge the pWal->apWiData[] array if required */
59822 if( pWal->nWiData<=iPage ){
59823 sqlite3_int64 nByte = sizeof(u32*)*(iPage+1);
59824 volatile u32 **apNew;
59825 apNew = (volatile u32 **)sqlite3_realloc64((void *)pWal->apWiData, nByte);
59826 if( !apNew ){
59827 *ppPage = 0;
59828 return SQLITE_NOMEM_BKPT;
59829 }
59830 memset((void*)&apNew[pWal->nWiData], 0,
@@ -61074,11 +61090,11 @@
61074 pWal->nCkpt++;
61075 pWal->hdr.mxFrame = 0;
61076 sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0]));
61077 memcpy(&pWal->hdr.aSalt[1], &salt1, 4);
61078 walIndexWriteHdr(pWal);
61079 pInfo->nBackfill = 0;
61080 pInfo->nBackfillAttempted = 0;
61081 pInfo->aReadMark[1] = 0;
61082 for(i=2; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED;
61083 assert( pInfo->aReadMark[0]==0 );
61084 }
@@ -61248,11 +61264,11 @@
61248 if( rc==SQLITE_OK ){
61249 rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags));
61250 }
61251 }
61252 if( rc==SQLITE_OK ){
61253 pInfo->nBackfill = mxSafeFrame;
61254 }
61255 }
61256
61257 /* Release the reader lock held while backfilling */
61258 walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1);
@@ -61871,11 +61887,11 @@
61871 }
61872
61873 assert( pWal->nWiData>0 );
61874 assert( pWal->apWiData[0]!=0 );
61875 pInfo = walCkptInfo(pWal);
61876 if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame
61877 #ifdef SQLITE_ENABLE_SNAPSHOT
61878 && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0)
61879 #endif
61880 ){
61881 /* The WAL has been completely backfilled (or it is empty).
@@ -62038,11 +62054,11 @@
62038 void *pBuf2 = sqlite3_malloc(szPage);
62039 if( pBuf1==0 || pBuf2==0 ){
62040 rc = SQLITE_NOMEM;
62041 }else{
62042 u32 i = pInfo->nBackfillAttempted;
62043 for(i=pInfo->nBackfillAttempted; i>pInfo->nBackfill; i--){
62044 WalHashLoc sLoc; /* Hash table location */
62045 u32 pgno; /* Page number in db file */
62046 i64 iDbOff; /* Offset of db file entry */
62047 i64 iWalOff; /* Offset of wal file entry */
62048
@@ -79307,10 +79323,11 @@
79307 char *zP4;
79308 char *zCom;
79309 sqlite3 dummyDb;
79310 static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n";
79311 if( pOut==0 ) pOut = stdout;
 
79312 dummyDb.mallocFailed = 1;
79313 zP4 = sqlite3VdbeDisplayP4(&dummyDb, pOp);
79314 #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
79315 zCom = sqlite3VdbeDisplayComment(0, pOp, zP4);
79316 #else
@@ -79325,10 +79342,11 @@
79325 zCom ? zCom : ""
79326 );
79327 fflush(pOut);
79328 sqlite3_free(zP4);
79329 sqlite3_free(zCom);
 
79330 }
79331 #endif
79332
79333 /*
79334 ** Initialize an array of N Mem element.
@@ -84066,11 +84084,11 @@
84066 p->db->errCode = SQLITE_OK;
84067
84068 /* If the bit corresponding to this variable in Vdbe.expmask is set, then
84069 ** binding a new value to this variable invalidates the current query plan.
84070 **
84071 ** IMPLEMENTATION-OF: R-48440-37595 If the specific value bound to host
84072 ** parameter in the WHERE clause might influence the choice of query plan
84073 ** for a statement, then the statement will be automatically recompiled,
84074 ** as if there had been a schema change, on the first sqlite3_step() call
84075 ** following any change to the bindings of that parameter.
84076 */
@@ -96365,12 +96383,12 @@
96365 *************************************************************************
96366 **
96367 ** This file implements virtual-tables for examining the bytecode content
96368 ** of a prepared statement.
96369 */
96370 #ifdef SQLITE_ENABLE_BYTECODE_VTAB
96371 /* #include "sqliteInt.h" */
 
96372 /* #include "vdbeInt.h" */
96373
96374 /* An instance of the bytecode() table-valued function.
96375 */
96376 typedef struct bytecodevtab bytecodevtab;
@@ -96771,10 +96789,12 @@
96771 if( rc==SQLITE_OK ){
96772 rc = sqlite3_create_module(db, "tables_used", &bytecodevtabModule, &db);
96773 }
96774 return rc;
96775 }
 
 
96776 #endif /* SQLITE_ENABLE_BYTECODE_VTAB */
96777
96778 /************** End of vdbevtab.c ********************************************/
96779 /************** Begin file memjournal.c **************************************/
96780 /*
@@ -103075,10 +103095,17 @@
103075 }
103076 setDoNotMergeFlagOnCopy(v);
103077 sqlite3VdbeResolveLabel(v, endCoalesce);
103078 break;
103079 }
 
 
 
 
 
 
 
103080
103081 default: {
103082 /* The UNLIKELY() function is a no-op. The result is the value
103083 ** of the first argument.
103084 */
@@ -105497,11 +105524,14 @@
105497 if( !zName ) goto exit_rename_table;
105498
105499 /* Check that a table or index named 'zName' does not already exist
105500 ** in database iDb. If so, this is an error.
105501 */
105502 if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){
 
 
 
105503 sqlite3ErrorMsg(pParse,
105504 "there is already another table or index with this name: %s", zName);
105505 goto exit_rename_table;
105506 }
105507
@@ -110244,26 +110274,43 @@
110244 ** exists */
110245 if( db->auth.authLevel<UAUTH_Admin && sqlite3UserAuthTable(zName)!=0 ){
110246 return 0;
110247 }
110248 #endif
110249 while(1){
110250 for(i=OMIT_TEMPDB; i<db->nDb; i++){
110251 int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
110252 if( zDatabase==0 || sqlite3DbIsNamed(db, j, zDatabase) ){
110253 assert( sqlite3SchemaMutexHeld(db, j, 0) );
110254 p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName);
110255 if( p ) return p;
110256 }
110257 }
110258 /* Not found. If the name we were looking for was temp.sqlite_master
110259 ** then change the name to sqlite_temp_master and try again. */
110260 if( sqlite3StrICmp(zName, MASTER_NAME)!=0 ) break;
110261 if( sqlite3_stricmp(zDatabase, db->aDb[1].zDbSName)!=0 ) break;
110262 zName = TEMP_MASTER_NAME;
110263 }
110264 return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110265 }
110266
110267 /*
110268 ** Locate the in-memory structure that describes a particular database
110269 ** table given the name of that table and (optionally) the name of the
@@ -112063,10 +112110,32 @@
112063 assert( pPk->nColumn==j );
112064 assert( pTab->nNVCol<=j );
112065 recomputeColumnsNotIndexed(pPk);
112066 }
112067
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112068 #ifndef SQLITE_OMIT_VIRTUALTABLE
112069 /*
112070 ** Return true if zName is a shadow table name in the current database
112071 ** connection.
112072 **
@@ -112074,26 +112143,21 @@
112074 ** restored to its original value prior to this routine returning.
112075 */
112076 SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){
112077 char *zTail; /* Pointer to the last "_" in zName */
112078 Table *pTab; /* Table that zName is a shadow of */
112079 Module *pMod; /* Module for the virtual table */
112080
112081 zTail = strrchr(zName, '_');
112082 if( zTail==0 ) return 0;
112083 *zTail = 0;
112084 pTab = sqlite3FindTable(db, zName, 0);
112085 *zTail = '_';
112086 if( pTab==0 ) return 0;
112087 if( !IsVirtual(pTab) ) return 0;
112088 pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]);
112089 if( pMod==0 ) return 0;
112090 if( pMod->pModule->iVersion<3 ) return 0;
112091 if( pMod->pModule->xShadowName==0 ) return 0;
112092 return pMod->pModule->xShadowName(zTail+1);
112093 }
112094 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
 
112095
112096 #ifdef SQLITE_DEBUG
112097 /*
112098 ** Mark all nodes of an expression as EP_Immutable, indicating that
112099 ** they should not be changed. Expressions attached to a table or
@@ -117780,11 +117844,11 @@
117780 if( (cntExpand&(cntExpand-1))==0 ){
117781 /* Grow the size of the output buffer only on substitutions
117782 ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */
117783 u8 *zOld;
117784 zOld = zOut;
117785 zOut = sqlite3_realloc64(zOut, (int)nOut + (nOut - nStr - 1));
117786 if( zOut==0 ){
117787 sqlite3_result_error_nomem(context);
117788 sqlite3_free(zOld);
117789 return;
117790 }
@@ -118477,11 +118541,11 @@
118477 FUNCTION(round, 2, 0, 0, roundFunc ),
118478 #endif
118479 FUNCTION(upper, 1, 0, 0, upperFunc ),
118480 FUNCTION(lower, 1, 0, 0, lowerFunc ),
118481 FUNCTION(hex, 1, 0, 0, hexFunc ),
118482 INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE),
118483 VFUNCTION(random, 0, 0, 0, randomFunc ),
118484 VFUNCTION(randomblob, 1, 0, 0, randomBlob ),
118485 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
118486 DFUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
118487 DFUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
@@ -118517,11 +118581,12 @@
118517 #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
118518 FUNCTION(unknown, -1, 0, 0, unknownFunc ),
118519 #endif
118520 FUNCTION(coalesce, 1, 0, 0, 0 ),
118521 FUNCTION(coalesce, 0, 0, 0, 0 ),
118522 INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE),
 
118523 };
118524 #ifndef SQLITE_OMIT_ALTERTABLE
118525 sqlite3AlterFunctions();
118526 #endif
118527 sqlite3WindowFunctions();
@@ -135570,11 +135635,11 @@
135570 need = nCol;
135571 }
135572 if( p->nData + need > p->nAlloc ){
135573 char **azNew;
135574 p->nAlloc = p->nAlloc*2 + need;
135575 azNew = sqlite3_realloc64( p->azResult, sizeof(char*)*p->nAlloc );
135576 if( azNew==0 ) goto malloc_failed;
135577 p->azResult = azNew;
135578 }
135579
135580 /* If this is the first row, then generate an extra row containing
@@ -135679,11 +135744,11 @@
135679 sqlite3_free_table(&res.azResult[1]);
135680 return rc;
135681 }
135682 if( res.nAlloc>res.nData ){
135683 char **azNew;
135684 azNew = sqlite3_realloc64( res.azResult, sizeof(char*)*res.nData );
135685 if( azNew==0 ){
135686 sqlite3_free_table(&res.azResult[1]);
135687 db->errCode = SQLITE_NOMEM;
135688 return SQLITE_NOMEM_BKPT;
135689 }
@@ -136969,14 +137034,14 @@
136969 ** Therefore, the P4 parameter is only required if the default value for
136970 ** the column is a literal number, string or null. The sqlite3ValueFromExpr()
136971 ** function is capable of transforming these types of expressions into
136972 ** sqlite3_value objects.
136973 **
136974 ** If parameter iReg is not negative, code an OP_RealAffinity instruction
136975 ** on register iReg. This is used when an equivalent integer value is
136976 ** stored in place of an 8-byte floating point value in order to save
136977 ** space.
136978 */
136979 SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
136980 assert( pTab!=0 );
136981 if( !pTab->pSelect ){
136982 sqlite3_value *pValue = 0;
@@ -136989,11 +137054,11 @@
136989 if( pValue ){
136990 sqlite3VdbeAppendP4(v, pValue, P4_MEM);
136991 }
136992 }
136993 #ifndef SQLITE_OMIT_FLOATING_POINT
136994 if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){
136995 sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
136996 }
136997 #endif
136998 }
136999
@@ -139838,11 +139903,11 @@
139838 assert( IsVirtual(pTab) );
139839 for(i=0; i<pToplevel->nVtabLock; i++){
139840 if( pTab==pToplevel->apVtabLock[i] ) return;
139841 }
139842 n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]);
139843 apVtabLock = sqlite3_realloc64(pToplevel->apVtabLock, n);
139844 if( apVtabLock ){
139845 pToplevel->apVtabLock = apVtabLock;
139846 pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab;
139847 }else{
139848 sqlite3OomFault(pToplevel->db);
@@ -151130,17 +151195,23 @@
151130 ){
151131 if( pAppend ){
151132 int i;
151133 int nInit = pList ? pList->nExpr : 0;
151134 for(i=0; i<pAppend->nExpr; i++){
151135 int iDummy;
151136 Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0);
151137 assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) );
151138 if( bIntToNull && pDup && sqlite3ExprIsInteger(pDup, &iDummy) ){
151139 pDup->op = TK_NULL;
151140 pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse);
151141 pDup->u.zToken = 0;
 
 
 
 
 
 
 
151142 }
151143 pList = sqlite3ExprListAppend(pParse, pList, pDup);
151144 if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags;
151145 }
151146 }
@@ -160322,10 +160393,11 @@
160322 }
160323 #endif
160324 if( rc==SQLITE_OK ){
160325 sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage,
160326 sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage);
 
160327 sqlite3GlobalConfig.isInit = 1;
160328 #ifdef SQLITE_EXTRA_INIT
160329 bRunExtraInit = 1;
160330 #endif
160331 }
@@ -163270,11 +163342,11 @@
163270 assert( SQLITE_OPEN_CREATE == 0x04 );
163271 testcase( (1<<(flags&7))==0x02 ); /* READONLY */
163272 testcase( (1<<(flags&7))==0x04 ); /* READWRITE */
163273 testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */
163274 if( ((1<<(flags&7)) & 0x46)==0 ){
163275 rc = SQLITE_MISUSE_BKPT; /* IMP: R-65497-44594 */
163276 }else{
163277 rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg);
163278 }
163279 if( rc!=SQLITE_OK ){
163280 if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
@@ -171194,10 +171266,11 @@
171194 while( *pRc==SQLITE_OK && pLeft->bEof==0 ){
171195 memset(pDl->pList, 0, pDl->nList);
171196 fts3EvalNextRow(pCsr, pLeft, pRc);
171197 }
171198 }
 
171199 }
171200 }
171201 break;
171202 }
171203
@@ -182739,11 +182812,11 @@
182739 iStart = pExpr->iPhrase * p->nCol;
182740 }else{
182741 iStart = pExpr->iPhrase * ((p->nCol + 31) / 32);
182742 }
182743
182744 while( 1 ){
182745 int nHit = fts3ColumnlistCount(&pIter);
182746 if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){
182747 if( p->flag==FTS3_MATCHINFO_LHITS ){
182748 p->aMatchinfo[iStart + iCol] = (u32)nHit;
182749 }else if( nHit ){
@@ -184653,10 +184726,11 @@
184653 }
184654
184655 /* Append N bytes from zIn onto the end of the JsonString string.
184656 */
184657 static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){
 
184658 if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return;
184659 memcpy(p->zBuf+p->nUsed, zIn, N);
184660 p->nUsed += N;
184661 }
184662
@@ -224664,11 +224738,11 @@
224664 int nArg, /* Number of args */
224665 sqlite3_value **apUnused /* Function arguments */
224666 ){
224667 assert( nArg==0 );
224668 UNUSED_PARAM2(nArg, apUnused);
224669 sqlite3_result_text(pCtx, "fts5: 2020-05-08 19:02:21 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff", -1, SQLITE_TRANSIENT);
224670 }
224671
224672 /*
224673 ** Return true if zName is the extension on one of the shadow tables used
224674 ** by this module.
@@ -229447,12 +229521,12 @@
229447 }
229448 #endif /* SQLITE_CORE */
229449 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
229450
229451 /************** End of stmt.c ************************************************/
229452 #if __LINE__!=229452
229453 #undef SQLITE_SOURCE_ID
229454 #define SQLITE_SOURCE_ID "2020-05-08 19:02:21 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f96alt2"
229455 #endif
229456 /* Return the source-id for this library */
229457 SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
229458 /************************** End of sqlite3.c ******************************/
229459
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -1162,11 +1162,11 @@
1162 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
1163 ** [sqlite_version()] and [sqlite_source_id()].
1164 */
1165 #define SQLITE_VERSION "3.32.0"
1166 #define SQLITE_VERSION_NUMBER 3032000
1167 #define SQLITE_SOURCE_ID "2020-05-17 13:47:28 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece"
1168
1169 /*
1170 ** CAPI3REF: Run-Time Library Version Numbers
1171 ** KEYWORDS: sqlite3_version sqlite3_sourceid
1172 **
@@ -6532,11 +6532,11 @@
6532 ** when first called if N is less than or equal to zero or if a memory
6533 ** allocate error occurs.
6534 **
6535 ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
6536 ** determined by the N parameter on first successful call. Changing the
6537 ** value of N in any subsequent call to sqlite3_aggregate_context() within
6538 ** the same aggregate function instance will not resize the memory
6539 ** allocation.)^ Within the xFinal callback, it is customary to set
6540 ** N=0 in calls to sqlite3_aggregate_context(C,N) so that no
6541 ** pointless memory allocations occur.
6542 **
@@ -17119,11 +17119,11 @@
17119 #define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */
17120 #define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/
17121 #define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */
17122 #define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */
17123 #define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */
17124 /* 0x0200 -- available for reuse */
17125 #define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */
17126 #define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */
17127 #define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */
17128 #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a
17129 ** single query - might change over time */
@@ -17140,10 +17140,11 @@
17140 #define INLINEFUNC_coalesce 0
17141 #define INLINEFUNC_implies_nonnull_row 1
17142 #define INLINEFUNC_expr_implies_expr 2
17143 #define INLINEFUNC_expr_compare 3
17144 #define INLINEFUNC_affinity 4
17145 #define INLINEFUNC_iif 5
17146 #define INLINEFUNC_unlikely 99 /* Default case */
17147
17148 /*
17149 ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
17150 ** used to create the initializers for the FuncDef structures.
@@ -20064,12 +20065,14 @@
20065 # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
20066 #endif
20067 SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db);
20068 #ifndef SQLITE_OMIT_VIRTUALTABLE
20069 SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName);
20070 SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3*,Table*,const char*);
20071 #else
20072 # define sqlite3ShadowTableName(A,B) 0
20073 # define sqlite3IsShadowTableOf(A,B,C) 0
20074 #endif
20075 SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*);
20076 SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*);
20077 SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*);
20078 SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int);
@@ -27924,11 +27927,11 @@
27927 }
27928 }else{
27929 assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
27930 assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
27931 sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
27932 pNew = sqlite3Realloc(p, n);
27933 if( !pNew ){
27934 sqlite3OomFault(db);
27935 }
27936 sqlite3MemdebugSetType(pNew,
27937 (db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
@@ -29001,11 +29004,11 @@
29004 p->nAlloc = (int)szNew;
29005 }
29006 if( p->db ){
29007 zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc);
29008 }else{
29009 zNew = sqlite3Realloc(zOld, p->nAlloc);
29010 }
29011 if( zNew ){
29012 assert( p->zText!=0 || p->nChar==0 );
29013 if( !isMalloced(p) && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar);
29014 p->zText = zNew;
@@ -29343,11 +29346,11 @@
29346 ** and segfaults if you give it a long long int.
29347 */
29348 SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){
29349 va_list ap;
29350 StrAccum acc;
29351 char zBuf[SQLITE_PRINT_BUF_SIZE*10];
29352 sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
29353 va_start(ap,zFormat);
29354 sqlite3_str_vappendf(&acc, zFormat, ap);
29355 va_end(ap);
29356 sqlite3StrAccumFinish(&acc);
@@ -45048,10 +45051,11 @@
45051 }
45052
45053 /* Forward references to VFS helper methods used for temporary files */
45054 static int winGetTempname(sqlite3_vfs *, char **);
45055 static int winIsDir(const void *);
45056 static BOOL winIsLongPathPrefix(const char *);
45057 static BOOL winIsDriveLetterAndColon(const char *);
45058
45059 /*
45060 ** Control and query of the open file handle.
45061 */
@@ -47026,10 +47030,21 @@
47030 *pResOut = rc;
47031 OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n",
47032 zFilename, pResOut, *pResOut));
47033 return SQLITE_OK;
47034 }
47035
47036 /*
47037 ** Returns non-zero if the specified path name starts with the "long path"
47038 ** prefix.
47039 */
47040 static BOOL winIsLongPathPrefix(
47041 const char *zPathname
47042 ){
47043 return ( zPathname[0]=='\\' && zPathname[1]=='\\'
47044 && zPathname[2]=='?' && zPathname[3]=='\\' );
47045 }
47046
47047 /*
47048 ** Returns non-zero if the specified path name starts with a drive letter
47049 ** followed by a colon character.
47050 */
@@ -47091,14 +47106,15 @@
47106 DWORD nByte;
47107 void *zConverted;
47108 char *zOut;
47109 #endif
47110
47111 /* If this path name begins with "/X:" or "\\?\", where "X" is any
47112 ** alphabetic character, discard the initial "/" from the pathname.
47113 */
47114 if( zRelative[0]=='/' && (winIsDriveLetterAndColon(zRelative+1)
47115 || winIsLongPathPrefix(zRelative+1)) ){
47116 zRelative++;
47117 }
47118
47119 #if defined(__CYGWIN__)
47120 SimulateIOError( return SQLITE_ERROR );
@@ -47850,11 +47866,11 @@
47866 if( newSz>p->szMax ){
47867 return SQLITE_FULL;
47868 }
47869 newSz *= 2;
47870 if( newSz>p->szMax ) newSz = p->szMax;
47871 pNew = sqlite3Realloc(p->aData, newSz);
47872 if( pNew==0 ) return SQLITE_NOMEM;
47873 p->aData = pNew;
47874 p->szAlloc = newSz;
47875 return SQLITE_OK;
47876 }
@@ -59820,11 +59836,11 @@
59836
59837 /* Enlarge the pWal->apWiData[] array if required */
59838 if( pWal->nWiData<=iPage ){
59839 sqlite3_int64 nByte = sizeof(u32*)*(iPage+1);
59840 volatile u32 **apNew;
59841 apNew = (volatile u32 **)sqlite3Realloc((void *)pWal->apWiData, nByte);
59842 if( !apNew ){
59843 *ppPage = 0;
59844 return SQLITE_NOMEM_BKPT;
59845 }
59846 memset((void*)&apNew[pWal->nWiData], 0,
@@ -61074,11 +61090,11 @@
61090 pWal->nCkpt++;
61091 pWal->hdr.mxFrame = 0;
61092 sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0]));
61093 memcpy(&pWal->hdr.aSalt[1], &salt1, 4);
61094 walIndexWriteHdr(pWal);
61095 AtomicStore(&pInfo->nBackfill, 0);
61096 pInfo->nBackfillAttempted = 0;
61097 pInfo->aReadMark[1] = 0;
61098 for(i=2; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED;
61099 assert( pInfo->aReadMark[0]==0 );
61100 }
@@ -61248,11 +61264,11 @@
61264 if( rc==SQLITE_OK ){
61265 rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags));
61266 }
61267 }
61268 if( rc==SQLITE_OK ){
61269 AtomicStore(&pInfo->nBackfill, mxSafeFrame);
61270 }
61271 }
61272
61273 /* Release the reader lock held while backfilling */
61274 walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1);
@@ -61871,11 +61887,11 @@
61887 }
61888
61889 assert( pWal->nWiData>0 );
61890 assert( pWal->apWiData[0]!=0 );
61891 pInfo = walCkptInfo(pWal);
61892 if( !useWal && AtomicLoad(&pInfo->nBackfill)==pWal->hdr.mxFrame
61893 #ifdef SQLITE_ENABLE_SNAPSHOT
61894 && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0)
61895 #endif
61896 ){
61897 /* The WAL has been completely backfilled (or it is empty).
@@ -62038,11 +62054,11 @@
62054 void *pBuf2 = sqlite3_malloc(szPage);
62055 if( pBuf1==0 || pBuf2==0 ){
62056 rc = SQLITE_NOMEM;
62057 }else{
62058 u32 i = pInfo->nBackfillAttempted;
62059 for(i=pInfo->nBackfillAttempted; i>AtomicLoad(&pInfo->nBackfill); i--){
62060 WalHashLoc sLoc; /* Hash table location */
62061 u32 pgno; /* Page number in db file */
62062 i64 iDbOff; /* Offset of db file entry */
62063 i64 iWalOff; /* Offset of wal file entry */
62064
@@ -79307,10 +79323,11 @@
79323 char *zP4;
79324 char *zCom;
79325 sqlite3 dummyDb;
79326 static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n";
79327 if( pOut==0 ) pOut = stdout;
79328 sqlite3BeginBenignMalloc();
79329 dummyDb.mallocFailed = 1;
79330 zP4 = sqlite3VdbeDisplayP4(&dummyDb, pOp);
79331 #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
79332 zCom = sqlite3VdbeDisplayComment(0, pOp, zP4);
79333 #else
@@ -79325,10 +79342,11 @@
79342 zCom ? zCom : ""
79343 );
79344 fflush(pOut);
79345 sqlite3_free(zP4);
79346 sqlite3_free(zCom);
79347 sqlite3EndBenignMalloc();
79348 }
79349 #endif
79350
79351 /*
79352 ** Initialize an array of N Mem element.
@@ -84066,11 +84084,11 @@
84084 p->db->errCode = SQLITE_OK;
84085
84086 /* If the bit corresponding to this variable in Vdbe.expmask is set, then
84087 ** binding a new value to this variable invalidates the current query plan.
84088 **
84089 ** IMPLEMENTATION-OF: R-57496-20354 If the specific value bound to a host
84090 ** parameter in the WHERE clause might influence the choice of query plan
84091 ** for a statement, then the statement will be automatically recompiled,
84092 ** as if there had been a schema change, on the first sqlite3_step() call
84093 ** following any change to the bindings of that parameter.
84094 */
@@ -96365,12 +96383,12 @@
96383 *************************************************************************
96384 **
96385 ** This file implements virtual-tables for examining the bytecode content
96386 ** of a prepared statement.
96387 */
 
96388 /* #include "sqliteInt.h" */
96389 #if defined(SQLITE_ENABLE_BYTECODE_VTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
96390 /* #include "vdbeInt.h" */
96391
96392 /* An instance of the bytecode() table-valued function.
96393 */
96394 typedef struct bytecodevtab bytecodevtab;
@@ -96771,10 +96789,12 @@
96789 if( rc==SQLITE_OK ){
96790 rc = sqlite3_create_module(db, "tables_used", &bytecodevtabModule, &db);
96791 }
96792 return rc;
96793 }
96794 #elif defined(SQLITE_ENABLE_BYTECODE_VTAB)
96795 SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ return SQLITE_OK; }
96796 #endif /* SQLITE_ENABLE_BYTECODE_VTAB */
96797
96798 /************** End of vdbevtab.c ********************************************/
96799 /************** Begin file memjournal.c **************************************/
96800 /*
@@ -103075,10 +103095,17 @@
103095 }
103096 setDoNotMergeFlagOnCopy(v);
103097 sqlite3VdbeResolveLabel(v, endCoalesce);
103098 break;
103099 }
103100 case INLINEFUNC_iif: {
103101 Expr caseExpr;
103102 memset(&caseExpr, 0, sizeof(caseExpr));
103103 caseExpr.op = TK_CASE;
103104 caseExpr.x.pList = pFarg;
103105 return sqlite3ExprCodeTarget(pParse, &caseExpr, target);
103106 }
103107
103108 default: {
103109 /* The UNLIKELY() function is a no-op. The result is the value
103110 ** of the first argument.
103111 */
@@ -105497,11 +105524,14 @@
105524 if( !zName ) goto exit_rename_table;
105525
105526 /* Check that a table or index named 'zName' does not already exist
105527 ** in database iDb. If so, this is an error.
105528 */
105529 if( sqlite3FindTable(db, zName, zDb)
105530 || sqlite3FindIndex(db, zName, zDb)
105531 || sqlite3IsShadowTableOf(db, pTab, zName)
105532 ){
105533 sqlite3ErrorMsg(pParse,
105534 "there is already another table or index with this name: %s", zName);
105535 goto exit_rename_table;
105536 }
105537
@@ -110244,26 +110274,43 @@
110274 ** exists */
110275 if( db->auth.authLevel<UAUTH_Admin && sqlite3UserAuthTable(zName)!=0 ){
110276 return 0;
110277 }
110278 #endif
110279 if( zDatabase ){
110280 for(i=0; i<db->nDb; i++){
110281 if( sqlite3StrICmp(zDatabase, db->aDb[i].zDbSName)==0 ) break;
110282 }
110283 if( i>=db->nDb ){
110284 /* No match against the official names. But always match "main"
110285 ** to schema 0 as a legacy fallback. */
110286 if( sqlite3StrICmp(zDatabase,"main")==0 ){
110287 i = 0;
110288 }else{
110289 return 0;
110290 }
110291 }
110292 p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName);
110293 if( p==0 && i==1 && sqlite3StrICmp(zName, MASTER_NAME)==0 ){
110294 /* All temp.sqlite_master to be an alias for sqlite_temp_master */
110295 p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, TEMP_MASTER_NAME);
110296 }
110297 }else{
110298 /* Match against TEMP first */
110299 p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, zName);
110300 if( p ) return p;
110301 /* The main database is second */
110302 p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, zName);
110303 if( p ) return p;
110304 /* Attached databases are in order of attachment */
110305 for(i=2; i<db->nDb; i++){
110306 assert( sqlite3SchemaMutexHeld(db, i, 0) );
110307 p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName);
110308 if( p ) break;
110309 }
110310 }
110311 return p;
110312 }
110313
110314 /*
110315 ** Locate the in-memory structure that describes a particular database
110316 ** table given the name of that table and (optionally) the name of the
@@ -112063,10 +112110,32 @@
112110 assert( pPk->nColumn==j );
112111 assert( pTab->nNVCol<=j );
112112 recomputeColumnsNotIndexed(pPk);
112113 }
112114
112115
112116 #ifndef SQLITE_OMIT_VIRTUALTABLE
112117 /*
112118 ** Return true if pTab is a virtual table and zName is a shadow table name
112119 ** for that virtual table.
112120 */
112121 SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *zName){
112122 int nName; /* Length of zName */
112123 Module *pMod; /* Module for the virtual table */
112124
112125 if( !IsVirtual(pTab) ) return 0;
112126 nName = sqlite3Strlen30(pTab->zName);
112127 if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0;
112128 if( zName[nName]!='_' ) return 0;
112129 pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]);
112130 if( pMod==0 ) return 0;
112131 if( pMod->pModule->iVersion<3 ) return 0;
112132 if( pMod->pModule->xShadowName==0 ) return 0;
112133 return pMod->pModule->xShadowName(zName+nName+1);
112134 }
112135 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
112136
112137 #ifndef SQLITE_OMIT_VIRTUALTABLE
112138 /*
112139 ** Return true if zName is a shadow table name in the current database
112140 ** connection.
112141 **
@@ -112074,26 +112143,21 @@
112143 ** restored to its original value prior to this routine returning.
112144 */
112145 SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){
112146 char *zTail; /* Pointer to the last "_" in zName */
112147 Table *pTab; /* Table that zName is a shadow of */
 
 
112148 zTail = strrchr(zName, '_');
112149 if( zTail==0 ) return 0;
112150 *zTail = 0;
112151 pTab = sqlite3FindTable(db, zName, 0);
112152 *zTail = '_';
112153 if( pTab==0 ) return 0;
112154 if( !IsVirtual(pTab) ) return 0;
112155 return sqlite3IsShadowTableOf(db, pTab, zName);
 
 
 
 
112156 }
112157 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
112158
112159
112160 #ifdef SQLITE_DEBUG
112161 /*
112162 ** Mark all nodes of an expression as EP_Immutable, indicating that
112163 ** they should not be changed. Expressions attached to a table or
@@ -117780,11 +117844,11 @@
117844 if( (cntExpand&(cntExpand-1))==0 ){
117845 /* Grow the size of the output buffer only on substitutions
117846 ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */
117847 u8 *zOld;
117848 zOld = zOut;
117849 zOut = sqlite3Realloc(zOut, (int)nOut + (nOut - nStr - 1));
117850 if( zOut==0 ){
117851 sqlite3_result_error_nomem(context);
117852 sqlite3_free(zOld);
117853 return;
117854 }
@@ -118477,11 +118541,11 @@
118541 FUNCTION(round, 2, 0, 0, roundFunc ),
118542 #endif
118543 FUNCTION(upper, 1, 0, 0, upperFunc ),
118544 FUNCTION(lower, 1, 0, 0, lowerFunc ),
118545 FUNCTION(hex, 1, 0, 0, hexFunc ),
118546 INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, 0 ),
118547 VFUNCTION(random, 0, 0, 0, randomFunc ),
118548 VFUNCTION(randomblob, 1, 0, 0, randomBlob ),
118549 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
118550 DFUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
118551 DFUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
@@ -118517,11 +118581,12 @@
118581 #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
118582 FUNCTION(unknown, -1, 0, 0, unknownFunc ),
118583 #endif
118584 FUNCTION(coalesce, 1, 0, 0, 0 ),
118585 FUNCTION(coalesce, 0, 0, 0, 0 ),
118586 INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, 0 ),
118587 INLINE_FUNC(iif, 3, INLINEFUNC_iif, 0 ),
118588 };
118589 #ifndef SQLITE_OMIT_ALTERTABLE
118590 sqlite3AlterFunctions();
118591 #endif
118592 sqlite3WindowFunctions();
@@ -135570,11 +135635,11 @@
135635 need = nCol;
135636 }
135637 if( p->nData + need > p->nAlloc ){
135638 char **azNew;
135639 p->nAlloc = p->nAlloc*2 + need;
135640 azNew = sqlite3Realloc( p->azResult, sizeof(char*)*p->nAlloc );
135641 if( azNew==0 ) goto malloc_failed;
135642 p->azResult = azNew;
135643 }
135644
135645 /* If this is the first row, then generate an extra row containing
@@ -135679,11 +135744,11 @@
135744 sqlite3_free_table(&res.azResult[1]);
135745 return rc;
135746 }
135747 if( res.nAlloc>res.nData ){
135748 char **azNew;
135749 azNew = sqlite3Realloc( res.azResult, sizeof(char*)*res.nData );
135750 if( azNew==0 ){
135751 sqlite3_free_table(&res.azResult[1]);
135752 db->errCode = SQLITE_NOMEM;
135753 return SQLITE_NOMEM_BKPT;
135754 }
@@ -136969,14 +137034,14 @@
137034 ** Therefore, the P4 parameter is only required if the default value for
137035 ** the column is a literal number, string or null. The sqlite3ValueFromExpr()
137036 ** function is capable of transforming these types of expressions into
137037 ** sqlite3_value objects.
137038 **
137039 ** If column as REAL affinity and the table is an ordinary b-tree table
137040 ** (not a virtual table) then the value might have been stored as an
137041 ** integer. In that case, add an OP_RealAffinity opcode to make sure
137042 ** it has been converted into REAL.
137043 */
137044 SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
137045 assert( pTab!=0 );
137046 if( !pTab->pSelect ){
137047 sqlite3_value *pValue = 0;
@@ -136989,11 +137054,11 @@
137054 if( pValue ){
137055 sqlite3VdbeAppendP4(v, pValue, P4_MEM);
137056 }
137057 }
137058 #ifndef SQLITE_OMIT_FLOATING_POINT
137059 if( pTab->aCol[i].affinity==SQLITE_AFF_REAL && !IsVirtual(pTab) ){
137060 sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
137061 }
137062 #endif
137063 }
137064
@@ -139838,11 +139903,11 @@
139903 assert( IsVirtual(pTab) );
139904 for(i=0; i<pToplevel->nVtabLock; i++){
139905 if( pTab==pToplevel->apVtabLock[i] ) return;
139906 }
139907 n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]);
139908 apVtabLock = sqlite3Realloc(pToplevel->apVtabLock, n);
139909 if( apVtabLock ){
139910 pToplevel->apVtabLock = apVtabLock;
139911 pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab;
139912 }else{
139913 sqlite3OomFault(pToplevel->db);
@@ -151130,17 +151195,23 @@
151195 ){
151196 if( pAppend ){
151197 int i;
151198 int nInit = pList ? pList->nExpr : 0;
151199 for(i=0; i<pAppend->nExpr; i++){
 
151200 Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0);
151201 assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) );
151202 if( bIntToNull && pDup ){
151203 int iDummy;
151204 Expr *pSub;
151205 for(pSub=pDup; ExprHasProperty(pSub, EP_Skip); pSub=pSub->pLeft){
151206 assert( pSub );
151207 }
151208 if( sqlite3ExprIsInteger(pSub, &iDummy) ){
151209 pSub->op = TK_NULL;
151210 pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse);
151211 pSub->u.zToken = 0;
151212 }
151213 }
151214 pList = sqlite3ExprListAppend(pParse, pList, pDup);
151215 if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags;
151216 }
151217 }
@@ -160322,10 +160393,11 @@
160393 }
160394 #endif
160395 if( rc==SQLITE_OK ){
160396 sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage,
160397 sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage);
160398 sqlite3MemoryBarrier();
160399 sqlite3GlobalConfig.isInit = 1;
160400 #ifdef SQLITE_EXTRA_INIT
160401 bRunExtraInit = 1;
160402 #endif
160403 }
@@ -163270,11 +163342,11 @@
163342 assert( SQLITE_OPEN_CREATE == 0x04 );
163343 testcase( (1<<(flags&7))==0x02 ); /* READONLY */
163344 testcase( (1<<(flags&7))==0x04 ); /* READWRITE */
163345 testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */
163346 if( ((1<<(flags&7)) & 0x46)==0 ){
163347 rc = SQLITE_MISUSE_BKPT; /* IMP: R-18321-05872 */
163348 }else{
163349 rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg);
163350 }
163351 if( rc!=SQLITE_OK ){
163352 if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
@@ -171194,10 +171266,11 @@
171266 while( *pRc==SQLITE_OK && pLeft->bEof==0 ){
171267 memset(pDl->pList, 0, pDl->nList);
171268 fts3EvalNextRow(pCsr, pLeft, pRc);
171269 }
171270 }
171271 pRight->bEof = pLeft->bEof = 1;
171272 }
171273 }
171274 break;
171275 }
171276
@@ -182739,11 +182812,11 @@
182812 iStart = pExpr->iPhrase * p->nCol;
182813 }else{
182814 iStart = pExpr->iPhrase * ((p->nCol + 31) / 32);
182815 }
182816
182817 if( pIter ) while( 1 ){
182818 int nHit = fts3ColumnlistCount(&pIter);
182819 if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){
182820 if( p->flag==FTS3_MATCHINFO_LHITS ){
182821 p->aMatchinfo[iStart + iCol] = (u32)nHit;
182822 }else if( nHit ){
@@ -184653,10 +184726,11 @@
184726 }
184727
184728 /* Append N bytes from zIn onto the end of the JsonString string.
184729 */
184730 static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){
184731 if( N==0 ) return;
184732 if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return;
184733 memcpy(p->zBuf+p->nUsed, zIn, N);
184734 p->nUsed += N;
184735 }
184736
@@ -224664,11 +224738,11 @@
224738 int nArg, /* Number of args */
224739 sqlite3_value **apUnused /* Function arguments */
224740 ){
224741 assert( nArg==0 );
224742 UNUSED_PARAM2(nArg, apUnused);
224743 sqlite3_result_text(pCtx, "fts5: 2020-05-17 00:26:44 1313557b512297e7b75ed748894379b2022aecf696d5a58318e46a668321c1ff", -1, SQLITE_TRANSIENT);
224744 }
224745
224746 /*
224747 ** Return true if zName is the extension on one of the shadow tables used
224748 ** by this module.
@@ -229447,12 +229521,12 @@
229521 }
229522 #endif /* SQLITE_CORE */
229523 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
229524
229525 /************** End of stmt.c ************************************************/
229526 #if __LINE__!=229526
229527 #undef SQLITE_SOURCE_ID
229528 #define SQLITE_SOURCE_ID "2020-05-17 13:47:28 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469falt2"
229529 #endif
229530 /* Return the source-id for this library */
229531 SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
229532 /************************** End of sqlite3.c ******************************/
229533
+2 -2
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -123,11 +123,11 @@
123123
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
124124
** [sqlite_version()] and [sqlite_source_id()].
125125
*/
126126
#define SQLITE_VERSION "3.32.0"
127127
#define SQLITE_VERSION_NUMBER 3032000
128
-#define SQLITE_SOURCE_ID "2020-05-08 19:02:21 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff"
128
+#define SQLITE_SOURCE_ID "2020-05-17 13:47:28 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece"
129129
130130
/*
131131
** CAPI3REF: Run-Time Library Version Numbers
132132
** KEYWORDS: sqlite3_version sqlite3_sourceid
133133
**
@@ -5493,11 +5493,11 @@
54935493
** when first called if N is less than or equal to zero or if a memory
54945494
** allocate error occurs.
54955495
**
54965496
** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
54975497
** determined by the N parameter on first successful call. Changing the
5498
-** value of N in any subsequents call to sqlite3_aggregate_context() within
5498
+** value of N in any subsequent call to sqlite3_aggregate_context() within
54995499
** the same aggregate function instance will not resize the memory
55005500
** allocation.)^ Within the xFinal callback, it is customary to set
55015501
** N=0 in calls to sqlite3_aggregate_context(C,N) so that no
55025502
** pointless memory allocations occur.
55035503
**
55045504
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -123,11 +123,11 @@
123 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
124 ** [sqlite_version()] and [sqlite_source_id()].
125 */
126 #define SQLITE_VERSION "3.32.0"
127 #define SQLITE_VERSION_NUMBER 3032000
128 #define SQLITE_SOURCE_ID "2020-05-08 19:02:21 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff"
129
130 /*
131 ** CAPI3REF: Run-Time Library Version Numbers
132 ** KEYWORDS: sqlite3_version sqlite3_sourceid
133 **
@@ -5493,11 +5493,11 @@
5493 ** when first called if N is less than or equal to zero or if a memory
5494 ** allocate error occurs.
5495 **
5496 ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
5497 ** determined by the N parameter on first successful call. Changing the
5498 ** value of N in any subsequents call to sqlite3_aggregate_context() within
5499 ** the same aggregate function instance will not resize the memory
5500 ** allocation.)^ Within the xFinal callback, it is customary to set
5501 ** N=0 in calls to sqlite3_aggregate_context(C,N) so that no
5502 ** pointless memory allocations occur.
5503 **
5504
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -123,11 +123,11 @@
123 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
124 ** [sqlite_version()] and [sqlite_source_id()].
125 */
126 #define SQLITE_VERSION "3.32.0"
127 #define SQLITE_VERSION_NUMBER 3032000
128 #define SQLITE_SOURCE_ID "2020-05-17 13:47:28 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece"
129
130 /*
131 ** CAPI3REF: Run-Time Library Version Numbers
132 ** KEYWORDS: sqlite3_version sqlite3_sourceid
133 **
@@ -5493,11 +5493,11 @@
5493 ** when first called if N is less than or equal to zero or if a memory
5494 ** allocate error occurs.
5495 **
5496 ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
5497 ** determined by the N parameter on first successful call. Changing the
5498 ** value of N in any subsequent call to sqlite3_aggregate_context() within
5499 ** the same aggregate function instance will not resize the memory
5500 ** allocation.)^ Within the xFinal callback, it is customary to set
5501 ** N=0 in calls to sqlite3_aggregate_context(C,N) so that no
5502 ** pointless memory allocations occur.
5503 **
5504
--- src/timeline.c
+++ src/timeline.c
@@ -1796,10 +1796,11 @@
17961796
}else if( fossil_stricmp(zMatchStyle, "regexp")==0 ){
17971797
matchStyle = MS_REGEXP;
17981798
}else{
17991799
/* For exact maching, inhibit links to the selected tag. */
18001800
zThisTag = zTagName;
1801
+ Th_Store("current_checkin", zTagName);
18011802
}
18021803
18031804
/* Display a checkbox to enable/disable display of related check-ins. */
18041805
if( advancedMenu ){
18051806
style_submenu_checkbox("rel", "Related", 0, 0);
18061807
--- src/timeline.c
+++ src/timeline.c
@@ -1796,10 +1796,11 @@
1796 }else if( fossil_stricmp(zMatchStyle, "regexp")==0 ){
1797 matchStyle = MS_REGEXP;
1798 }else{
1799 /* For exact maching, inhibit links to the selected tag. */
1800 zThisTag = zTagName;
 
1801 }
1802
1803 /* Display a checkbox to enable/disable display of related check-ins. */
1804 if( advancedMenu ){
1805 style_submenu_checkbox("rel", "Related", 0, 0);
1806
--- src/timeline.c
+++ src/timeline.c
@@ -1796,10 +1796,11 @@
1796 }else if( fossil_stricmp(zMatchStyle, "regexp")==0 ){
1797 matchStyle = MS_REGEXP;
1798 }else{
1799 /* For exact maching, inhibit links to the selected tag. */
1800 zThisTag = zTagName;
1801 Th_Store("current_checkin", zTagName);
1802 }
1803
1804 /* Display a checkbox to enable/disable display of related check-ins. */
1805 if( advancedMenu ){
1806 style_submenu_checkbox("rel", "Related", 0, 0);
1807
+2 -2
--- www/cgi.wiki
+++ www/cgi.wiki
@@ -14,12 +14,12 @@
1414
script]. CGI is the technique that the three
1515
[./selfhost.wiki|self-hosting Fossil repositories] all use.
1616
1717
Setting up a Fossil server using CGI is mostly about writing a short
1818
script (usually just 2 lines line) in the cgi-bin folder of an ordinary
19
-web-browser. But there are a lot of extra options that can be added
20
-to this script, to customize the configuration. This article descripts
19
+web-server. But there are a lot of extra options that can be added
20
+to this script, to customize the configuration. This article describes
2121
those options.
2222
2323
<h1>CGI Script Options</h1>
2424
2525
The CGI script used to launch a Fossil server will usually look something
2626
--- www/cgi.wiki
+++ www/cgi.wiki
@@ -14,12 +14,12 @@
14 script]. CGI is the technique that the three
15 [./selfhost.wiki|self-hosting Fossil repositories] all use.
16
17 Setting up a Fossil server using CGI is mostly about writing a short
18 script (usually just 2 lines line) in the cgi-bin folder of an ordinary
19 web-browser. But there are a lot of extra options that can be added
20 to this script, to customize the configuration. This article descripts
21 those options.
22
23 <h1>CGI Script Options</h1>
24
25 The CGI script used to launch a Fossil server will usually look something
26
--- www/cgi.wiki
+++ www/cgi.wiki
@@ -14,12 +14,12 @@
14 script]. CGI is the technique that the three
15 [./selfhost.wiki|self-hosting Fossil repositories] all use.
16
17 Setting up a Fossil server using CGI is mostly about writing a short
18 script (usually just 2 lines line) in the cgi-bin folder of an ordinary
19 web-server. But there are a lot of extra options that can be added
20 to this script, to customize the configuration. This article describes
21 those options.
22
23 <h1>CGI Script Options</h1>
24
25 The CGI script used to launch a Fossil server will usually look something
26
+1 -1
--- www/index.wiki
+++ www/index.wiki
@@ -9,11 +9,11 @@
99
<li> [./build.wiki | Install]
1010
<li> [https://fossil-scm.org/forum | Support/Forum ]
1111
<li> [./hints.wiki | Tips &amp; Hints]
1212
<li> [./changes.wiki | Change Log]
1313
<li> [../COPYRIGHT-BSD2.txt | License]
14
-<li> [./userlinks.wiki | User inks]
14
+<li> [./userlinks.wiki | User Links]
1515
<li> [./hacker-howto.wiki | Hacker How-To]
1616
<li> [./fossil-v-git.wiki | Fossil vs. Git]
1717
<li> [./permutedindex.html | Documentation Index]
1818
</ul>
1919
<img src="fossil3.gif" align="center">
2020
--- www/index.wiki
+++ www/index.wiki
@@ -9,11 +9,11 @@
9 <li> [./build.wiki | Install]
10 <li> [https://fossil-scm.org/forum | Support/Forum ]
11 <li> [./hints.wiki | Tips &amp; Hints]
12 <li> [./changes.wiki | Change Log]
13 <li> [../COPYRIGHT-BSD2.txt | License]
14 <li> [./userlinks.wiki | User inks]
15 <li> [./hacker-howto.wiki | Hacker How-To]
16 <li> [./fossil-v-git.wiki | Fossil vs. Git]
17 <li> [./permutedindex.html | Documentation Index]
18 </ul>
19 <img src="fossil3.gif" align="center">
20
--- www/index.wiki
+++ www/index.wiki
@@ -9,11 +9,11 @@
9 <li> [./build.wiki | Install]
10 <li> [https://fossil-scm.org/forum | Support/Forum ]
11 <li> [./hints.wiki | Tips &amp; Hints]
12 <li> [./changes.wiki | Change Log]
13 <li> [../COPYRIGHT-BSD2.txt | License]
14 <li> [./userlinks.wiki | User Links]
15 <li> [./hacker-howto.wiki | Hacker How-To]
16 <li> [./fossil-v-git.wiki | Fossil vs. Git]
17 <li> [./permutedindex.html | Documentation Index]
18 </ul>
19 <img src="fossil3.gif" align="center">
20

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button