Fossil SCM

Merge latest changes from trunk

ashish 2011-10-16 12:56 ashish-ipv6 merge
Commit 1349e5ed20bd6ea5cbd84fb31be7db22a1463c3f
+3 -1
--- src/browse.c
+++ src/browse.c
@@ -249,11 +249,13 @@
249249
/* Generate a multi-column table listing the contents of zD[]
250250
** directory.
251251
*/
252252
mxLen = db_int(12, "SELECT max(length(x)) FROM localfiles /*scan*/");
253253
cnt = db_int(0, "SELECT count(*) FROM localfiles /*scan*/");
254
- nCol = 4;
254
+ nCol = 100/mxLen;
255
+ if( nCol<1 ) nCol = 1;
256
+ if( nCol>5 ) nCol = 5;
255257
nRow = (cnt+nCol-1)/nCol;
256258
db_prepare(&q, "SELECT x, u FROM localfiles ORDER BY x /*scan*/");
257259
@ <table class="browser"><tr><td class="browser"><ul class="browser">
258260
i = 0;
259261
while( db_step(&q)==SQLITE_ROW ){
260262
--- src/browse.c
+++ src/browse.c
@@ -249,11 +249,13 @@
249 /* Generate a multi-column table listing the contents of zD[]
250 ** directory.
251 */
252 mxLen = db_int(12, "SELECT max(length(x)) FROM localfiles /*scan*/");
253 cnt = db_int(0, "SELECT count(*) FROM localfiles /*scan*/");
254 nCol = 4;
 
 
255 nRow = (cnt+nCol-1)/nCol;
256 db_prepare(&q, "SELECT x, u FROM localfiles ORDER BY x /*scan*/");
257 @ <table class="browser"><tr><td class="browser"><ul class="browser">
258 i = 0;
259 while( db_step(&q)==SQLITE_ROW ){
260
--- src/browse.c
+++ src/browse.c
@@ -249,11 +249,13 @@
249 /* Generate a multi-column table listing the contents of zD[]
250 ** directory.
251 */
252 mxLen = db_int(12, "SELECT max(length(x)) FROM localfiles /*scan*/");
253 cnt = db_int(0, "SELECT count(*) FROM localfiles /*scan*/");
254 nCol = 100/mxLen;
255 if( nCol<1 ) nCol = 1;
256 if( nCol>5 ) nCol = 5;
257 nRow = (cnt+nCol-1)/nCol;
258 db_prepare(&q, "SELECT x, u FROM localfiles ORDER BY x /*scan*/");
259 @ <table class="browser"><tr><td class="browser"><ul class="browser">
260 i = 0;
261 while( db_step(&q)==SQLITE_ROW ){
262
+13 -15
--- src/cgi.c
+++ src/cgi.c
@@ -363,11 +363,11 @@
363363
/*
364364
** Do a redirect request to the URL given in the argument.
365365
**
366366
** The URL must be relative to the base of the fossil server.
367367
*/
368
-void cgi_redirect(const char *zURL){
368
+NORETURN void cgi_redirect(const char *zURL){
369369
char *zLocation;
370370
CGIDEBUG(("redirect to %s\n", zURL));
371371
if( strncmp(zURL,"http:",5)==0 || strncmp(zURL,"https:",6)==0 ){
372372
zLocation = mprintf("Location: %s\r\n", zURL);
373373
}else if( *zURL=='/' ){
@@ -382,11 +382,11 @@
382382
cgi_set_status(302, "Moved Temporarily");
383383
free(zLocation);
384384
cgi_reply();
385385
fossil_exit(0);
386386
}
387
-void cgi_redirectf(const char *zFormat, ...){
387
+NORETURN void cgi_redirectf(const char *zFormat, ...){
388388
va_list ap;
389389
va_start(ap, zFormat);
390390
cgi_redirect(vmprintf(zFormat, ap));
391391
va_end(ap);
392392
}
@@ -889,26 +889,23 @@
889889
}
890890
891891
/*
892892
** Print all query parameters on standard output. Format the
893893
** parameters as HTML. This is used for testing and debugging.
894
-** Release builds omit the values of the cookies to avoid defeating
895
-** the purpose of setting HttpOnly cookies.
894
+**
895
+** Omit the values of the cookies unless showAll is true.
896896
*/
897
-void cgi_print_all(void){
897
+void cgi_print_all(int showAll){
898898
int i;
899
- int showAll = 0;
900
-#ifdef FOSSIL_DEBUG
901
- /* Show the values of cookies in debug mode. */
902
- showAll = 1;
903
-#endif
904899
cgi_parameter("",""); /* Force the parameters into sorted order */
905900
for(i=0; i<nUsedQP; i++){
906
- if( showAll || (fossil_stricmp("HTTP_COOKIE",aParamQP[i].zName)!=0 && fossil_strnicmp("fossil-",aParamQP[i].zName,7)!=0) ){
907
- cgi_printf("%s = %s <br />\n",
908
- htmlize(aParamQP[i].zName, -1), htmlize(aParamQP[i].zValue, -1));
901
+ const char *zName = aParamQP[i].zName;
902
+ if( !showAll ){
903
+ if( fossil_stricmp("HTTP_COOKIE",zName)==0 ) continue;
904
+ if( fossil_strnicmp("fossil-",zName,7)==0 ) continue;
909905
}
906
+ cgi_printf("%h = %h <br />\n", zName, aParamQP[i].zValue);
910907
}
911908
}
912909
913910
/*
914911
** This routine works like "printf" except that it has the
@@ -931,11 +928,11 @@
931928
932929
933930
/*
934931
** Send a reply indicating that the HTTP request was malformed
935932
*/
936
-static void malformed_request(void){
933
+static NORETURN void malformed_request(void){
937934
cgi_set_status(501, "Not Implemented");
938935
cgi_printf(
939936
"<html><body>Unrecognized HTTP Request</body></html>\n"
940937
);
941938
cgi_reply();
@@ -943,11 +940,11 @@
943940
}
944941
945942
/*
946943
** Panic and die while processing a webpage.
947944
*/
948
-void cgi_panic(const char *zFormat, ...){
945
+NORETURN void cgi_panic(const char *zFormat, ...){
949946
va_list ap;
950947
cgi_reset_content();
951948
cgi_set_status(500, "Internal Server Error");
952949
cgi_printf(
953950
"<html><body><h1>Internal Server Error</h1>\n"
@@ -1217,10 +1214,11 @@
12171214
sleep( nchildren-MAX_PARALLEL );
12181215
}
12191216
delay.tv_sec = 60;
12201217
delay.tv_usec = 0;
12211218
FD_ZERO(&readfds);
1219
+ assert( listener>=0 );
12221220
FD_SET( listener, &readfds);
12231221
select( listener+1, &readfds, 0, 0, &delay);
12241222
if( FD_ISSET(listener, &readfds) ){
12251223
lenaddr = sizeof(inaddr);
12261224
connection = accept(listener, (struct sockaddr*)&inaddr, &lenaddr);
12271225
--- src/cgi.c
+++ src/cgi.c
@@ -363,11 +363,11 @@
363 /*
364 ** Do a redirect request to the URL given in the argument.
365 **
366 ** The URL must be relative to the base of the fossil server.
367 */
368 void cgi_redirect(const char *zURL){
369 char *zLocation;
370 CGIDEBUG(("redirect to %s\n", zURL));
371 if( strncmp(zURL,"http:",5)==0 || strncmp(zURL,"https:",6)==0 ){
372 zLocation = mprintf("Location: %s\r\n", zURL);
373 }else if( *zURL=='/' ){
@@ -382,11 +382,11 @@
382 cgi_set_status(302, "Moved Temporarily");
383 free(zLocation);
384 cgi_reply();
385 fossil_exit(0);
386 }
387 void cgi_redirectf(const char *zFormat, ...){
388 va_list ap;
389 va_start(ap, zFormat);
390 cgi_redirect(vmprintf(zFormat, ap));
391 va_end(ap);
392 }
@@ -889,26 +889,23 @@
889 }
890
891 /*
892 ** Print all query parameters on standard output. Format the
893 ** parameters as HTML. This is used for testing and debugging.
894 ** Release builds omit the values of the cookies to avoid defeating
895 ** the purpose of setting HttpOnly cookies.
896 */
897 void cgi_print_all(void){
898 int i;
899 int showAll = 0;
900 #ifdef FOSSIL_DEBUG
901 /* Show the values of cookies in debug mode. */
902 showAll = 1;
903 #endif
904 cgi_parameter("",""); /* Force the parameters into sorted order */
905 for(i=0; i<nUsedQP; i++){
906 if( showAll || (fossil_stricmp("HTTP_COOKIE",aParamQP[i].zName)!=0 && fossil_strnicmp("fossil-",aParamQP[i].zName,7)!=0) ){
907 cgi_printf("%s = %s <br />\n",
908 htmlize(aParamQP[i].zName, -1), htmlize(aParamQP[i].zValue, -1));
 
909 }
 
910 }
911 }
912
913 /*
914 ** This routine works like "printf" except that it has the
@@ -931,11 +928,11 @@
931
932
933 /*
934 ** Send a reply indicating that the HTTP request was malformed
935 */
936 static void malformed_request(void){
937 cgi_set_status(501, "Not Implemented");
938 cgi_printf(
939 "<html><body>Unrecognized HTTP Request</body></html>\n"
940 );
941 cgi_reply();
@@ -943,11 +940,11 @@
943 }
944
945 /*
946 ** Panic and die while processing a webpage.
947 */
948 void cgi_panic(const char *zFormat, ...){
949 va_list ap;
950 cgi_reset_content();
951 cgi_set_status(500, "Internal Server Error");
952 cgi_printf(
953 "<html><body><h1>Internal Server Error</h1>\n"
@@ -1217,10 +1214,11 @@
1217 sleep( nchildren-MAX_PARALLEL );
1218 }
1219 delay.tv_sec = 60;
1220 delay.tv_usec = 0;
1221 FD_ZERO(&readfds);
 
1222 FD_SET( listener, &readfds);
1223 select( listener+1, &readfds, 0, 0, &delay);
1224 if( FD_ISSET(listener, &readfds) ){
1225 lenaddr = sizeof(inaddr);
1226 connection = accept(listener, (struct sockaddr*)&inaddr, &lenaddr);
1227
--- src/cgi.c
+++ src/cgi.c
@@ -363,11 +363,11 @@
363 /*
364 ** Do a redirect request to the URL given in the argument.
365 **
366 ** The URL must be relative to the base of the fossil server.
367 */
368 NORETURN void cgi_redirect(const char *zURL){
369 char *zLocation;
370 CGIDEBUG(("redirect to %s\n", zURL));
371 if( strncmp(zURL,"http:",5)==0 || strncmp(zURL,"https:",6)==0 ){
372 zLocation = mprintf("Location: %s\r\n", zURL);
373 }else if( *zURL=='/' ){
@@ -382,11 +382,11 @@
382 cgi_set_status(302, "Moved Temporarily");
383 free(zLocation);
384 cgi_reply();
385 fossil_exit(0);
386 }
387 NORETURN void cgi_redirectf(const char *zFormat, ...){
388 va_list ap;
389 va_start(ap, zFormat);
390 cgi_redirect(vmprintf(zFormat, ap));
391 va_end(ap);
392 }
@@ -889,26 +889,23 @@
889 }
890
891 /*
892 ** Print all query parameters on standard output. Format the
893 ** parameters as HTML. This is used for testing and debugging.
894 **
895 ** Omit the values of the cookies unless showAll is true.
896 */
897 void cgi_print_all(int showAll){
898 int i;
 
 
 
 
 
899 cgi_parameter("",""); /* Force the parameters into sorted order */
900 for(i=0; i<nUsedQP; i++){
901 const char *zName = aParamQP[i].zName;
902 if( !showAll ){
903 if( fossil_stricmp("HTTP_COOKIE",zName)==0 ) continue;
904 if( fossil_strnicmp("fossil-",zName,7)==0 ) continue;
905 }
906 cgi_printf("%h = %h <br />\n", zName, aParamQP[i].zValue);
907 }
908 }
909
910 /*
911 ** This routine works like "printf" except that it has the
@@ -931,11 +928,11 @@
928
929
930 /*
931 ** Send a reply indicating that the HTTP request was malformed
932 */
933 static NORETURN void malformed_request(void){
934 cgi_set_status(501, "Not Implemented");
935 cgi_printf(
936 "<html><body>Unrecognized HTTP Request</body></html>\n"
937 );
938 cgi_reply();
@@ -943,11 +940,11 @@
940 }
941
942 /*
943 ** Panic and die while processing a webpage.
944 */
945 NORETURN void cgi_panic(const char *zFormat, ...){
946 va_list ap;
947 cgi_reset_content();
948 cgi_set_status(500, "Internal Server Error");
949 cgi_printf(
950 "<html><body><h1>Internal Server Error</h1>\n"
@@ -1217,10 +1214,11 @@
1214 sleep( nchildren-MAX_PARALLEL );
1215 }
1216 delay.tv_sec = 60;
1217 delay.tv_usec = 0;
1218 FD_ZERO(&readfds);
1219 assert( listener>=0 );
1220 FD_SET( listener, &readfds);
1221 select( listener+1, &readfds, 0, 0, &delay);
1222 if( FD_ISSET(listener, &readfds) ){
1223 lenaddr = sizeof(inaddr);
1224 connection = accept(listener, (struct sockaddr*)&inaddr, &lenaddr);
1225
+13 -15
--- src/cgi.c
+++ src/cgi.c
@@ -363,11 +363,11 @@
363363
/*
364364
** Do a redirect request to the URL given in the argument.
365365
**
366366
** The URL must be relative to the base of the fossil server.
367367
*/
368
-void cgi_redirect(const char *zURL){
368
+NORETURN void cgi_redirect(const char *zURL){
369369
char *zLocation;
370370
CGIDEBUG(("redirect to %s\n", zURL));
371371
if( strncmp(zURL,"http:",5)==0 || strncmp(zURL,"https:",6)==0 ){
372372
zLocation = mprintf("Location: %s\r\n", zURL);
373373
}else if( *zURL=='/' ){
@@ -382,11 +382,11 @@
382382
cgi_set_status(302, "Moved Temporarily");
383383
free(zLocation);
384384
cgi_reply();
385385
fossil_exit(0);
386386
}
387
-void cgi_redirectf(const char *zFormat, ...){
387
+NORETURN void cgi_redirectf(const char *zFormat, ...){
388388
va_list ap;
389389
va_start(ap, zFormat);
390390
cgi_redirect(vmprintf(zFormat, ap));
391391
va_end(ap);
392392
}
@@ -889,26 +889,23 @@
889889
}
890890
891891
/*
892892
** Print all query parameters on standard output. Format the
893893
** parameters as HTML. This is used for testing and debugging.
894
-** Release builds omit the values of the cookies to avoid defeating
895
-** the purpose of setting HttpOnly cookies.
894
+**
895
+** Omit the values of the cookies unless showAll is true.
896896
*/
897
-void cgi_print_all(void){
897
+void cgi_print_all(int showAll){
898898
int i;
899
- int showAll = 0;
900
-#ifdef FOSSIL_DEBUG
901
- /* Show the values of cookies in debug mode. */
902
- showAll = 1;
903
-#endif
904899
cgi_parameter("",""); /* Force the parameters into sorted order */
905900
for(i=0; i<nUsedQP; i++){
906
- if( showAll || (fossil_stricmp("HTTP_COOKIE",aParamQP[i].zName)!=0 && fossil_strnicmp("fossil-",aParamQP[i].zName,7)!=0) ){
907
- cgi_printf("%s = %s <br />\n",
908
- htmlize(aParamQP[i].zName, -1), htmlize(aParamQP[i].zValue, -1));
901
+ const char *zName = aParamQP[i].zName;
902
+ if( !showAll ){
903
+ if( fossil_stricmp("HTTP_COOKIE",zName)==0 ) continue;
904
+ if( fossil_strnicmp("fossil-",zName,7)==0 ) continue;
909905
}
906
+ cgi_printf("%h = %h <br />\n", zName, aParamQP[i].zValue);
910907
}
911908
}
912909
913910
/*
914911
** This routine works like "printf" except that it has the
@@ -931,11 +928,11 @@
931928
932929
933930
/*
934931
** Send a reply indicating that the HTTP request was malformed
935932
*/
936
-static void malformed_request(void){
933
+static NORETURN void malformed_request(void){
937934
cgi_set_status(501, "Not Implemented");
938935
cgi_printf(
939936
"<html><body>Unrecognized HTTP Request</body></html>\n"
940937
);
941938
cgi_reply();
@@ -943,11 +940,11 @@
943940
}
944941
945942
/*
946943
** Panic and die while processing a webpage.
947944
*/
948
-void cgi_panic(const char *zFormat, ...){
945
+NORETURN void cgi_panic(const char *zFormat, ...){
949946
va_list ap;
950947
cgi_reset_content();
951948
cgi_set_status(500, "Internal Server Error");
952949
cgi_printf(
953950
"<html><body><h1>Internal Server Error</h1>\n"
@@ -1217,10 +1214,11 @@
12171214
sleep( nchildren-MAX_PARALLEL );
12181215
}
12191216
delay.tv_sec = 60;
12201217
delay.tv_usec = 0;
12211218
FD_ZERO(&readfds);
1219
+ assert( listener>=0 );
12221220
FD_SET( listener, &readfds);
12231221
select( listener+1, &readfds, 0, 0, &delay);
12241222
if( FD_ISSET(listener, &readfds) ){
12251223
lenaddr = sizeof(inaddr);
12261224
connection = accept(listener, (struct sockaddr*)&inaddr, &lenaddr);
12271225
--- src/cgi.c
+++ src/cgi.c
@@ -363,11 +363,11 @@
363 /*
364 ** Do a redirect request to the URL given in the argument.
365 **
366 ** The URL must be relative to the base of the fossil server.
367 */
368 void cgi_redirect(const char *zURL){
369 char *zLocation;
370 CGIDEBUG(("redirect to %s\n", zURL));
371 if( strncmp(zURL,"http:",5)==0 || strncmp(zURL,"https:",6)==0 ){
372 zLocation = mprintf("Location: %s\r\n", zURL);
373 }else if( *zURL=='/' ){
@@ -382,11 +382,11 @@
382 cgi_set_status(302, "Moved Temporarily");
383 free(zLocation);
384 cgi_reply();
385 fossil_exit(0);
386 }
387 void cgi_redirectf(const char *zFormat, ...){
388 va_list ap;
389 va_start(ap, zFormat);
390 cgi_redirect(vmprintf(zFormat, ap));
391 va_end(ap);
392 }
@@ -889,26 +889,23 @@
889 }
890
891 /*
892 ** Print all query parameters on standard output. Format the
893 ** parameters as HTML. This is used for testing and debugging.
894 ** Release builds omit the values of the cookies to avoid defeating
895 ** the purpose of setting HttpOnly cookies.
896 */
897 void cgi_print_all(void){
898 int i;
899 int showAll = 0;
900 #ifdef FOSSIL_DEBUG
901 /* Show the values of cookies in debug mode. */
902 showAll = 1;
903 #endif
904 cgi_parameter("",""); /* Force the parameters into sorted order */
905 for(i=0; i<nUsedQP; i++){
906 if( showAll || (fossil_stricmp("HTTP_COOKIE",aParamQP[i].zName)!=0 && fossil_strnicmp("fossil-",aParamQP[i].zName,7)!=0) ){
907 cgi_printf("%s = %s <br />\n",
908 htmlize(aParamQP[i].zName, -1), htmlize(aParamQP[i].zValue, -1));
 
909 }
 
910 }
911 }
912
913 /*
914 ** This routine works like "printf" except that it has the
@@ -931,11 +928,11 @@
931
932
933 /*
934 ** Send a reply indicating that the HTTP request was malformed
935 */
936 static void malformed_request(void){
937 cgi_set_status(501, "Not Implemented");
938 cgi_printf(
939 "<html><body>Unrecognized HTTP Request</body></html>\n"
940 );
941 cgi_reply();
@@ -943,11 +940,11 @@
943 }
944
945 /*
946 ** Panic and die while processing a webpage.
947 */
948 void cgi_panic(const char *zFormat, ...){
949 va_list ap;
950 cgi_reset_content();
951 cgi_set_status(500, "Internal Server Error");
952 cgi_printf(
953 "<html><body><h1>Internal Server Error</h1>\n"
@@ -1217,10 +1214,11 @@
1217 sleep( nchildren-MAX_PARALLEL );
1218 }
1219 delay.tv_sec = 60;
1220 delay.tv_usec = 0;
1221 FD_ZERO(&readfds);
 
1222 FD_SET( listener, &readfds);
1223 select( listener+1, &readfds, 0, 0, &delay);
1224 if( FD_ISSET(listener, &readfds) ){
1225 lenaddr = sizeof(inaddr);
1226 connection = accept(listener, (struct sockaddr*)&inaddr, &lenaddr);
1227
--- src/cgi.c
+++ src/cgi.c
@@ -363,11 +363,11 @@
363 /*
364 ** Do a redirect request to the URL given in the argument.
365 **
366 ** The URL must be relative to the base of the fossil server.
367 */
368 NORETURN void cgi_redirect(const char *zURL){
369 char *zLocation;
370 CGIDEBUG(("redirect to %s\n", zURL));
371 if( strncmp(zURL,"http:",5)==0 || strncmp(zURL,"https:",6)==0 ){
372 zLocation = mprintf("Location: %s\r\n", zURL);
373 }else if( *zURL=='/' ){
@@ -382,11 +382,11 @@
382 cgi_set_status(302, "Moved Temporarily");
383 free(zLocation);
384 cgi_reply();
385 fossil_exit(0);
386 }
387 NORETURN void cgi_redirectf(const char *zFormat, ...){
388 va_list ap;
389 va_start(ap, zFormat);
390 cgi_redirect(vmprintf(zFormat, ap));
391 va_end(ap);
392 }
@@ -889,26 +889,23 @@
889 }
890
891 /*
892 ** Print all query parameters on standard output. Format the
893 ** parameters as HTML. This is used for testing and debugging.
894 **
895 ** Omit the values of the cookies unless showAll is true.
896 */
897 void cgi_print_all(int showAll){
898 int i;
 
 
 
 
 
899 cgi_parameter("",""); /* Force the parameters into sorted order */
900 for(i=0; i<nUsedQP; i++){
901 const char *zName = aParamQP[i].zName;
902 if( !showAll ){
903 if( fossil_stricmp("HTTP_COOKIE",zName)==0 ) continue;
904 if( fossil_strnicmp("fossil-",zName,7)==0 ) continue;
905 }
906 cgi_printf("%h = %h <br />\n", zName, aParamQP[i].zValue);
907 }
908 }
909
910 /*
911 ** This routine works like "printf" except that it has the
@@ -931,11 +928,11 @@
928
929
930 /*
931 ** Send a reply indicating that the HTTP request was malformed
932 */
933 static NORETURN void malformed_request(void){
934 cgi_set_status(501, "Not Implemented");
935 cgi_printf(
936 "<html><body>Unrecognized HTTP Request</body></html>\n"
937 );
938 cgi_reply();
@@ -943,11 +940,11 @@
940 }
941
942 /*
943 ** Panic and die while processing a webpage.
944 */
945 NORETURN void cgi_panic(const char *zFormat, ...){
946 va_list ap;
947 cgi_reset_content();
948 cgi_set_status(500, "Internal Server Error");
949 cgi_printf(
950 "<html><body><h1>Internal Server Error</h1>\n"
@@ -1217,10 +1214,11 @@
1214 sleep( nchildren-MAX_PARALLEL );
1215 }
1216 delay.tv_sec = 60;
1217 delay.tv_usec = 0;
1218 FD_ZERO(&readfds);
1219 assert( listener>=0 );
1220 FD_SET( listener, &readfds);
1221 select( listener+1, &readfds, 0, 0, &delay);
1222 if( FD_ISSET(listener, &readfds) ){
1223 lenaddr = sizeof(inaddr);
1224 connection = accept(listener, (struct sockaddr*)&inaddr, &lenaddr);
1225
--- src/config.h
+++ src/config.h
@@ -134,6 +134,15 @@
134134
#else /* Generates a warning - but it always works */
135135
# define FOSSIL_INT_TO_PTR(X) ((void*)(X))
136136
# define FOSSIL_PTR_TO_INT(X) ((int)(X))
137137
#endif
138138
139
+/*
140
+** A marker for functions that never return.
141
+*/
142
+#if defined(__GNUC__) || defined(__clang__)
143
+# define NORETURN __attribute__((__noreturn__))
144
+#else
145
+# define NORETURN
146
+#endif
147
+
139148
#endif /* _RC_COMPILE_ */
140149
--- src/config.h
+++ src/config.h
@@ -134,6 +134,15 @@
134 #else /* Generates a warning - but it always works */
135 # define FOSSIL_INT_TO_PTR(X) ((void*)(X))
136 # define FOSSIL_PTR_TO_INT(X) ((int)(X))
137 #endif
138
 
 
 
 
 
 
 
 
 
139 #endif /* _RC_COMPILE_ */
140
--- src/config.h
+++ src/config.h
@@ -134,6 +134,15 @@
134 #else /* Generates a warning - but it always works */
135 # define FOSSIL_INT_TO_PTR(X) ((void*)(X))
136 # define FOSSIL_PTR_TO_INT(X) ((int)(X))
137 #endif
138
139 /*
140 ** A marker for functions that never return.
141 */
142 #if defined(__GNUC__) || defined(__clang__)
143 # define NORETURN __attribute__((__noreturn__))
144 #else
145 # define NORETURN
146 #endif
147
148 #endif /* _RC_COMPILE_ */
149
+2 -2
--- src/db.c
+++ src/db.c
@@ -742,20 +742,20 @@
742742
/*
743743
* * Returns TRUE if zTable exists in the local database.
744744
*/
745745
static int db_local_table_exists(const char *zTable){
746746
return db_exists("SELECT 1 FROM %s.sqlite_master"
747
- " WHERE name=='%s'",
747
+ " WHERE name=='%s' /*scan*/",
748748
db_name("localdb"), zTable);
749749
}
750750
751751
/*
752752
** Returns TRUE if zColumn exists in zTable in the local database.
753753
*/
754754
static int db_local_column_exists(const char *zTable, const char *zColumn){
755755
return db_exists("SELECT 1 FROM %s.sqlite_master"
756
- " WHERE name=='%s' AND sql GLOB '* %s *'",
756
+ " WHERE name=='%s' AND sql GLOB '* %s *' /*scan*/",
757757
db_name("localdb"), zTable, zColumn);
758758
}
759759
760760
/*
761761
** If zDbName is a valid local database file, open it and return
762762
--- src/db.c
+++ src/db.c
@@ -742,20 +742,20 @@
742 /*
743 * * Returns TRUE if zTable exists in the local database.
744 */
745 static int db_local_table_exists(const char *zTable){
746 return db_exists("SELECT 1 FROM %s.sqlite_master"
747 " WHERE name=='%s'",
748 db_name("localdb"), zTable);
749 }
750
751 /*
752 ** Returns TRUE if zColumn exists in zTable in the local database.
753 */
754 static int db_local_column_exists(const char *zTable, const char *zColumn){
755 return db_exists("SELECT 1 FROM %s.sqlite_master"
756 " WHERE name=='%s' AND sql GLOB '* %s *'",
757 db_name("localdb"), zTable, zColumn);
758 }
759
760 /*
761 ** If zDbName is a valid local database file, open it and return
762
--- src/db.c
+++ src/db.c
@@ -742,20 +742,20 @@
742 /*
743 * * Returns TRUE if zTable exists in the local database.
744 */
745 static int db_local_table_exists(const char *zTable){
746 return db_exists("SELECT 1 FROM %s.sqlite_master"
747 " WHERE name=='%s' /*scan*/",
748 db_name("localdb"), zTable);
749 }
750
751 /*
752 ** Returns TRUE if zColumn exists in zTable in the local database.
753 */
754 static int db_local_column_exists(const char *zTable, const char *zColumn){
755 return db_exists("SELECT 1 FROM %s.sqlite_master"
756 " WHERE name=='%s' AND sql GLOB '* %s *' /*scan*/",
757 db_name("localdb"), zTable, zColumn);
758 }
759
760 /*
761 ** If zDbName is a valid local database file, open it and return
762
-1
--- src/diff.c
+++ src/diff.c
@@ -711,11 +711,10 @@
711711
p->c.nEdit = 0;
712712
p->c.nEditAlloc = 0;
713713
714714
/* Clear out the from file */
715715
free(p->c.aFrom);
716
- blob_zero(pParent);
717716
718717
/* Return no errors */
719718
return 0;
720719
}
721720
722721
--- src/diff.c
+++ src/diff.c
@@ -711,11 +711,10 @@
711 p->c.nEdit = 0;
712 p->c.nEditAlloc = 0;
713
714 /* Clear out the from file */
715 free(p->c.aFrom);
716 blob_zero(pParent);
717
718 /* Return no errors */
719 return 0;
720 }
721
722
--- src/diff.c
+++ src/diff.c
@@ -711,11 +711,10 @@
711 p->c.nEdit = 0;
712 p->c.nEditAlloc = 0;
713
714 /* Clear out the from file */
715 free(p->c.aFrom);
 
716
717 /* Return no errors */
718 return 0;
719 }
720
721
+1 -1
--- src/http.c
+++ src/http.c
@@ -136,11 +136,11 @@
136136
Blob login; /* The login card */
137137
Blob payload; /* The complete payload including login card */
138138
Blob hdr; /* The HTTP request header */
139139
int closeConnection; /* True to close the connection when done */
140140
int iLength; /* Length of the reply payload */
141
- int rc; /* Result code */
141
+ int rc = 0; /* Result code */
142142
int iHttpVersion; /* Which version of HTTP protocol server uses */
143143
char *zLine; /* A single line of the reply header */
144144
int i; /* Loop counter */
145145
int isError = 0; /* True if the reply is an error message */
146146
int isCompressed = 1; /* True if the reply is compressed */
147147
--- src/http.c
+++ src/http.c
@@ -136,11 +136,11 @@
136 Blob login; /* The login card */
137 Blob payload; /* The complete payload including login card */
138 Blob hdr; /* The HTTP request header */
139 int closeConnection; /* True to close the connection when done */
140 int iLength; /* Length of the reply payload */
141 int rc; /* Result code */
142 int iHttpVersion; /* Which version of HTTP protocol server uses */
143 char *zLine; /* A single line of the reply header */
144 int i; /* Loop counter */
145 int isError = 0; /* True if the reply is an error message */
146 int isCompressed = 1; /* True if the reply is compressed */
147
--- src/http.c
+++ src/http.c
@@ -136,11 +136,11 @@
136 Blob login; /* The login card */
137 Blob payload; /* The complete payload including login card */
138 Blob hdr; /* The HTTP request header */
139 int closeConnection; /* True to close the connection when done */
140 int iLength; /* Length of the reply payload */
141 int rc = 0; /* Result code */
142 int iHttpVersion; /* Which version of HTTP protocol server uses */
143 char *zLine; /* A single line of the reply header */
144 int i; /* Loop counter */
145 int isError = 0; /* True if the reply is an error message */
146 int isCompressed = 1; /* True if the reply is compressed */
147
+1 -1
--- src/info.c
+++ src/info.c
@@ -797,11 +797,11 @@
797797
" WHERE filename.fnid=mlink.fnid"
798798
" AND event.objid=mlink.mid"
799799
" AND a.rid=mlink.fid"
800800
" AND b.rid=mlink.mid"
801801
" AND mlink.fid=%d"
802
- " ORDER BY filename.name, event.mtime",
802
+ " ORDER BY filename.name, event.mtime /*sort*/",
803803
TAG_BRANCH, rid
804804
);
805805
@ <ul>
806806
while( db_step(&q)==SQLITE_ROW ){
807807
const char *zName = db_column_text(&q, 0);
808808
--- src/info.c
+++ src/info.c
@@ -797,11 +797,11 @@
797 " WHERE filename.fnid=mlink.fnid"
798 " AND event.objid=mlink.mid"
799 " AND a.rid=mlink.fid"
800 " AND b.rid=mlink.mid"
801 " AND mlink.fid=%d"
802 " ORDER BY filename.name, event.mtime",
803 TAG_BRANCH, rid
804 );
805 @ <ul>
806 while( db_step(&q)==SQLITE_ROW ){
807 const char *zName = db_column_text(&q, 0);
808
--- src/info.c
+++ src/info.c
@@ -797,11 +797,11 @@
797 " WHERE filename.fnid=mlink.fnid"
798 " AND event.objid=mlink.mid"
799 " AND a.rid=mlink.fid"
800 " AND b.rid=mlink.mid"
801 " AND mlink.fid=%d"
802 " ORDER BY filename.name, event.mtime /*sort*/",
803 TAG_BRANCH, rid
804 );
805 @ <ul>
806 while( db_step(&q)==SQLITE_ROW ){
807 const char *zName = db_column_text(&q, 0);
808
+1 -1
--- src/login.c
+++ src/login.c
@@ -91,11 +91,11 @@
9191
if( zCookieName==0 ){
9292
zCookieName = db_text(0,
9393
"SELECT 'fossil-' || substr(value,1,16)"
9494
" FROM config"
9595
" WHERE name IN ('project-code','login-group-code')"
96
- " ORDER BY name;"
96
+ " ORDER BY name /*sort*/"
9797
);
9898
}
9999
return zCookieName;
100100
}
101101
102102
--- src/login.c
+++ src/login.c
@@ -91,11 +91,11 @@
91 if( zCookieName==0 ){
92 zCookieName = db_text(0,
93 "SELECT 'fossil-' || substr(value,1,16)"
94 " FROM config"
95 " WHERE name IN ('project-code','login-group-code')"
96 " ORDER BY name;"
97 );
98 }
99 return zCookieName;
100 }
101
102
--- src/login.c
+++ src/login.c
@@ -91,11 +91,11 @@
91 if( zCookieName==0 ){
92 zCookieName = db_text(0,
93 "SELECT 'fossil-' || substr(value,1,16)"
94 " FROM config"
95 " WHERE name IN ('project-code','login-group-code')"
96 " ORDER BY name /*sort*/"
97 );
98 }
99 return zCookieName;
100 }
101
102
+1 -1
--- src/login.c
+++ src/login.c
@@ -91,11 +91,11 @@
9191
if( zCookieName==0 ){
9292
zCookieName = db_text(0,
9393
"SELECT 'fossil-' || substr(value,1,16)"
9494
" FROM config"
9595
" WHERE name IN ('project-code','login-group-code')"
96
- " ORDER BY name;"
96
+ " ORDER BY name /*sort*/"
9797
);
9898
}
9999
return zCookieName;
100100
}
101101
102102
--- src/login.c
+++ src/login.c
@@ -91,11 +91,11 @@
91 if( zCookieName==0 ){
92 zCookieName = db_text(0,
93 "SELECT 'fossil-' || substr(value,1,16)"
94 " FROM config"
95 " WHERE name IN ('project-code','login-group-code')"
96 " ORDER BY name;"
97 );
98 }
99 return zCookieName;
100 }
101
102
--- src/login.c
+++ src/login.c
@@ -91,11 +91,11 @@
91 if( zCookieName==0 ){
92 zCookieName = db_text(0,
93 "SELECT 'fossil-' || substr(value,1,16)"
94 " FROM config"
95 " WHERE name IN ('project-code','login-group-code')"
96 " ORDER BY name /*sort*/"
97 );
98 }
99 return zCookieName;
100 }
101
102
+4 -4
--- src/main.c
+++ src/main.c
@@ -402,20 +402,20 @@
402402
}
403403
404404
/*
405405
** Exit. Take care to close the database first.
406406
*/
407
-void fossil_exit(int rc){
407
+NORETURN void fossil_exit(int rc){
408408
db_close(1);
409409
exit(rc);
410410
}
411411
412412
/*
413413
** Print an error message, rollback all databases, and quit. These
414414
** routines never return.
415415
*/
416
-void fossil_panic(const char *zFormat, ...){
416
+NORETURN void fossil_panic(const char *zFormat, ...){
417417
char *z;
418418
va_list ap;
419419
static int once = 1;
420420
mainInFatalError = 1;
421421
va_start(ap, zFormat);
@@ -430,11 +430,11 @@
430430
fossil_puts(zOut, 1);
431431
}
432432
db_force_rollback();
433433
fossil_exit(1);
434434
}
435
-void fossil_fatal(const char *zFormat, ...){
435
+NORETURN void fossil_fatal(const char *zFormat, ...){
436436
char *z;
437437
va_list ap;
438438
mainInFatalError = 1;
439439
va_start(ap, zFormat);
440440
z = vmprintf(zFormat, ap);
@@ -919,11 +919,11 @@
919919
}
920920
921921
/*
922922
** Send an HTTP redirect back to the designated Index Page.
923923
*/
924
-void fossil_redirect_home(void){
924
+NORETURN void fossil_redirect_home(void){
925925
cgi_redirectf("%s%s", g.zTop, db_get("index-page", "/index"));
926926
}
927927
928928
/*
929929
** If running as root, chroot to the directory containing the
930930
--- src/main.c
+++ src/main.c
@@ -402,20 +402,20 @@
402 }
403
404 /*
405 ** Exit. Take care to close the database first.
406 */
407 void fossil_exit(int rc){
408 db_close(1);
409 exit(rc);
410 }
411
412 /*
413 ** Print an error message, rollback all databases, and quit. These
414 ** routines never return.
415 */
416 void fossil_panic(const char *zFormat, ...){
417 char *z;
418 va_list ap;
419 static int once = 1;
420 mainInFatalError = 1;
421 va_start(ap, zFormat);
@@ -430,11 +430,11 @@
430 fossil_puts(zOut, 1);
431 }
432 db_force_rollback();
433 fossil_exit(1);
434 }
435 void fossil_fatal(const char *zFormat, ...){
436 char *z;
437 va_list ap;
438 mainInFatalError = 1;
439 va_start(ap, zFormat);
440 z = vmprintf(zFormat, ap);
@@ -919,11 +919,11 @@
919 }
920
921 /*
922 ** Send an HTTP redirect back to the designated Index Page.
923 */
924 void fossil_redirect_home(void){
925 cgi_redirectf("%s%s", g.zTop, db_get("index-page", "/index"));
926 }
927
928 /*
929 ** If running as root, chroot to the directory containing the
930
--- src/main.c
+++ src/main.c
@@ -402,20 +402,20 @@
402 }
403
404 /*
405 ** Exit. Take care to close the database first.
406 */
407 NORETURN void fossil_exit(int rc){
408 db_close(1);
409 exit(rc);
410 }
411
412 /*
413 ** Print an error message, rollback all databases, and quit. These
414 ** routines never return.
415 */
416 NORETURN void fossil_panic(const char *zFormat, ...){
417 char *z;
418 va_list ap;
419 static int once = 1;
420 mainInFatalError = 1;
421 va_start(ap, zFormat);
@@ -430,11 +430,11 @@
430 fossil_puts(zOut, 1);
431 }
432 db_force_rollback();
433 fossil_exit(1);
434 }
435 NORETURN void fossil_fatal(const char *zFormat, ...){
436 char *z;
437 va_list ap;
438 mainInFatalError = 1;
439 va_start(ap, zFormat);
440 z = vmprintf(zFormat, ap);
@@ -919,11 +919,11 @@
919 }
920
921 /*
922 ** Send an HTTP redirect back to the designated Index Page.
923 */
924 NORETURN void fossil_redirect_home(void){
925 cgi_redirectf("%s%s", g.zTop, db_get("index-page", "/index"));
926 }
927
928 /*
929 ** If running as root, chroot to the directory containing the
930
+4 -4
--- src/main.c
+++ src/main.c
@@ -402,20 +402,20 @@
402402
}
403403
404404
/*
405405
** Exit. Take care to close the database first.
406406
*/
407
-void fossil_exit(int rc){
407
+NORETURN void fossil_exit(int rc){
408408
db_close(1);
409409
exit(rc);
410410
}
411411
412412
/*
413413
** Print an error message, rollback all databases, and quit. These
414414
** routines never return.
415415
*/
416
-void fossil_panic(const char *zFormat, ...){
416
+NORETURN void fossil_panic(const char *zFormat, ...){
417417
char *z;
418418
va_list ap;
419419
static int once = 1;
420420
mainInFatalError = 1;
421421
va_start(ap, zFormat);
@@ -430,11 +430,11 @@
430430
fossil_puts(zOut, 1);
431431
}
432432
db_force_rollback();
433433
fossil_exit(1);
434434
}
435
-void fossil_fatal(const char *zFormat, ...){
435
+NORETURN void fossil_fatal(const char *zFormat, ...){
436436
char *z;
437437
va_list ap;
438438
mainInFatalError = 1;
439439
va_start(ap, zFormat);
440440
z = vmprintf(zFormat, ap);
@@ -919,11 +919,11 @@
919919
}
920920
921921
/*
922922
** Send an HTTP redirect back to the designated Index Page.
923923
*/
924
-void fossil_redirect_home(void){
924
+NORETURN void fossil_redirect_home(void){
925925
cgi_redirectf("%s%s", g.zTop, db_get("index-page", "/index"));
926926
}
927927
928928
/*
929929
** If running as root, chroot to the directory containing the
930930
--- src/main.c
+++ src/main.c
@@ -402,20 +402,20 @@
402 }
403
404 /*
405 ** Exit. Take care to close the database first.
406 */
407 void fossil_exit(int rc){
408 db_close(1);
409 exit(rc);
410 }
411
412 /*
413 ** Print an error message, rollback all databases, and quit. These
414 ** routines never return.
415 */
416 void fossil_panic(const char *zFormat, ...){
417 char *z;
418 va_list ap;
419 static int once = 1;
420 mainInFatalError = 1;
421 va_start(ap, zFormat);
@@ -430,11 +430,11 @@
430 fossil_puts(zOut, 1);
431 }
432 db_force_rollback();
433 fossil_exit(1);
434 }
435 void fossil_fatal(const char *zFormat, ...){
436 char *z;
437 va_list ap;
438 mainInFatalError = 1;
439 va_start(ap, zFormat);
440 z = vmprintf(zFormat, ap);
@@ -919,11 +919,11 @@
919 }
920
921 /*
922 ** Send an HTTP redirect back to the designated Index Page.
923 */
924 void fossil_redirect_home(void){
925 cgi_redirectf("%s%s", g.zTop, db_get("index-page", "/index"));
926 }
927
928 /*
929 ** If running as root, chroot to the directory containing the
930
--- src/main.c
+++ src/main.c
@@ -402,20 +402,20 @@
402 }
403
404 /*
405 ** Exit. Take care to close the database first.
406 */
407 NORETURN void fossil_exit(int rc){
408 db_close(1);
409 exit(rc);
410 }
411
412 /*
413 ** Print an error message, rollback all databases, and quit. These
414 ** routines never return.
415 */
416 NORETURN void fossil_panic(const char *zFormat, ...){
417 char *z;
418 va_list ap;
419 static int once = 1;
420 mainInFatalError = 1;
421 va_start(ap, zFormat);
@@ -430,11 +430,11 @@
430 fossil_puts(zOut, 1);
431 }
432 db_force_rollback();
433 fossil_exit(1);
434 }
435 NORETURN void fossil_fatal(const char *zFormat, ...){
436 char *z;
437 va_list ap;
438 mainInFatalError = 1;
439 va_start(ap, zFormat);
440 z = vmprintf(zFormat, ap);
@@ -919,11 +919,11 @@
919 }
920
921 /*
922 ** Send an HTTP redirect back to the designated Index Page.
923 */
924 NORETURN void fossil_redirect_home(void){
925 cgi_redirectf("%s%s", g.zTop, db_get("index-page", "/index"));
926 }
927
928 /*
929 ** If running as root, chroot to the directory containing the
930
+2 -2
--- src/name.c
+++ src/name.c
@@ -154,11 +154,11 @@
154154
" WHERE tag.tagname='sym-%q' "
155155
" AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
156156
" AND event.objid=tagxref.rid "
157157
" AND blob.rid=event.objid "
158158
" AND event.type GLOB '%q'"
159
- " ORDER BY event.mtime DESC ",
159
+ " ORDER BY event.mtime DESC /*sort*/",
160160
zTag, zType
161161
);
162162
if( zUuid==0 ){
163163
int nTag = strlen(zTag);
164164
int i;
@@ -180,11 +180,11 @@
180180
" AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
181181
" AND event.objid=tagxref.rid "
182182
" AND blob.rid=event.objid "
183183
" AND event.mtime<=julianday(%Q %s)"
184184
" AND event.type GLOB '%q'"
185
- " ORDER BY event.mtime DESC ",
185
+ " ORDER BY event.mtime DESC /*sort*/ ",
186186
zTagBase, zDate, (useUtc ? "" : ",'utc'"), zType
187187
);
188188
break;
189189
}
190190
}
191191
--- src/name.c
+++ src/name.c
@@ -154,11 +154,11 @@
154 " WHERE tag.tagname='sym-%q' "
155 " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
156 " AND event.objid=tagxref.rid "
157 " AND blob.rid=event.objid "
158 " AND event.type GLOB '%q'"
159 " ORDER BY event.mtime DESC ",
160 zTag, zType
161 );
162 if( zUuid==0 ){
163 int nTag = strlen(zTag);
164 int i;
@@ -180,11 +180,11 @@
180 " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
181 " AND event.objid=tagxref.rid "
182 " AND blob.rid=event.objid "
183 " AND event.mtime<=julianday(%Q %s)"
184 " AND event.type GLOB '%q'"
185 " ORDER BY event.mtime DESC ",
186 zTagBase, zDate, (useUtc ? "" : ",'utc'"), zType
187 );
188 break;
189 }
190 }
191
--- src/name.c
+++ src/name.c
@@ -154,11 +154,11 @@
154 " WHERE tag.tagname='sym-%q' "
155 " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
156 " AND event.objid=tagxref.rid "
157 " AND blob.rid=event.objid "
158 " AND event.type GLOB '%q'"
159 " ORDER BY event.mtime DESC /*sort*/",
160 zTag, zType
161 );
162 if( zUuid==0 ){
163 int nTag = strlen(zTag);
164 int i;
@@ -180,11 +180,11 @@
180 " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
181 " AND event.objid=tagxref.rid "
182 " AND blob.rid=event.objid "
183 " AND event.mtime<=julianday(%Q %s)"
184 " AND event.type GLOB '%q'"
185 " ORDER BY event.mtime DESC /*sort*/ ",
186 zTagBase, zDate, (useUtc ? "" : ",'utc'"), zType
187 );
188 break;
189 }
190 }
191
+2 -1
--- src/path.c
+++ src/path.c
@@ -95,12 +95,13 @@
9595
}
9696
9797
/*
9898
** Construct the path from path.pStart to path.pEnd in the u.pTo fields.
9999
*/
100
-void path_reverse_path(void){
100
+static void path_reverse_path(void){
101101
PathNode *p;
102
+ assert( path.pEnd!=0 );
102103
for(p=path.pEnd; p && p->pFrom; p = p->pFrom){
103104
p->pFrom->u.pTo = p;
104105
}
105106
path.pEnd->u.pTo = 0;
106107
assert( p==path.pStart );
107108
--- src/path.c
+++ src/path.c
@@ -95,12 +95,13 @@
95 }
96
97 /*
98 ** Construct the path from path.pStart to path.pEnd in the u.pTo fields.
99 */
100 void path_reverse_path(void){
101 PathNode *p;
 
102 for(p=path.pEnd; p && p->pFrom; p = p->pFrom){
103 p->pFrom->u.pTo = p;
104 }
105 path.pEnd->u.pTo = 0;
106 assert( p==path.pStart );
107
--- src/path.c
+++ src/path.c
@@ -95,12 +95,13 @@
95 }
96
97 /*
98 ** Construct the path from path.pStart to path.pEnd in the u.pTo fields.
99 */
100 static void path_reverse_path(void){
101 PathNode *p;
102 assert( path.pEnd!=0 );
103 for(p=path.pEnd; p && p->pFrom; p = p->pFrom){
104 p->pFrom->u.pTo = p;
105 }
106 path.pEnd->u.pTo = 0;
107 assert( p==path.pStart );
108
+10 -1
--- src/setup.c
+++ src/setup.c
@@ -848,18 +848,27 @@
848848
@ <a href="%s(g.zTop)/help/server">fossil http</a> commands
849849
@ without the "--localauth" option.
850850
@ <li> The server is started from CGI without the "localauth" keyword
851851
@ in the CGI script.
852852
@ </ol>
853
+ @
854
+ @ <hr />
855
+ onoff_attribute("Enable /test_env",
856
+ "test_env_enable", "test_env_enable", 0);
857
+ @ <p>When enabled, the %h(g.zBaseURL)/test_env URL is available to all
858
+ @ users. When disabled (the default) only users Admin and Setup can visit
859
+ @ the /test_env page.
860
+ @ </p>
861
+ @
853862
@ <hr />
854863
onoff_attribute("Allow REMOTE_USER authentication",
855864
"remote_user_ok", "remote_user_ok", 0);
856865
@ <p>When enabled, if the REMOTE_USER environment variable is set to the
857866
@ login name of a valid user and no other login credentials are available,
858867
@ then the REMOTE_USER is accepted as an authenticated user.
859868
@ </p>
860
-
869
+ @
861870
@ <hr />
862871
entry_attribute("Login expiration time", 6, "cookie-expire", "cex", "8766");
863872
@ <p>The number of hours for which a login is valid. This must be a
864873
@ positive number. The default is 8760 hours which is approximately equal
865874
@ to a year.</p>
866875
--- src/setup.c
+++ src/setup.c
@@ -848,18 +848,27 @@
848 @ <a href="%s(g.zTop)/help/server">fossil http</a> commands
849 @ without the "--localauth" option.
850 @ <li> The server is started from CGI without the "localauth" keyword
851 @ in the CGI script.
852 @ </ol>
 
 
 
 
 
 
 
 
 
853 @ <hr />
854 onoff_attribute("Allow REMOTE_USER authentication",
855 "remote_user_ok", "remote_user_ok", 0);
856 @ <p>When enabled, if the REMOTE_USER environment variable is set to the
857 @ login name of a valid user and no other login credentials are available,
858 @ then the REMOTE_USER is accepted as an authenticated user.
859 @ </p>
860
861 @ <hr />
862 entry_attribute("Login expiration time", 6, "cookie-expire", "cex", "8766");
863 @ <p>The number of hours for which a login is valid. This must be a
864 @ positive number. The default is 8760 hours which is approximately equal
865 @ to a year.</p>
866
--- src/setup.c
+++ src/setup.c
@@ -848,18 +848,27 @@
848 @ <a href="%s(g.zTop)/help/server">fossil http</a> commands
849 @ without the "--localauth" option.
850 @ <li> The server is started from CGI without the "localauth" keyword
851 @ in the CGI script.
852 @ </ol>
853 @
854 @ <hr />
855 onoff_attribute("Enable /test_env",
856 "test_env_enable", "test_env_enable", 0);
857 @ <p>When enabled, the %h(g.zBaseURL)/test_env URL is available to all
858 @ users. When disabled (the default) only users Admin and Setup can visit
859 @ the /test_env page.
860 @ </p>
861 @
862 @ <hr />
863 onoff_attribute("Allow REMOTE_USER authentication",
864 "remote_user_ok", "remote_user_ok", 0);
865 @ <p>When enabled, if the REMOTE_USER environment variable is set to the
866 @ login name of a valid user and no other login credentials are available,
867 @ then the REMOTE_USER is accepted as an authenticated user.
868 @ </p>
869 @
870 @ <hr />
871 entry_attribute("Login expiration time", 6, "cookie-expire", "cex", "8766");
872 @ <p>The number of hours for which a login is valid. This must be a
873 @ positive number. The default is 8760 hours which is approximately equal
874 @ to a year.</p>
875
+63 -40
--- src/shell.c
+++ src/shell.c
@@ -15,10 +15,21 @@
1515
#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
1616
/* This needs to come before any includes for MSVC compiler */
1717
#define _CRT_SECURE_NO_WARNINGS
1818
#endif
1919
20
+/*
21
+** Enable large-file support for fopen() and friends on unix.
22
+*/
23
+#ifndef SQLITE_DISABLE_LFS
24
+# define _LARGE_FILE 1
25
+# ifndef _FILE_OFFSET_BITS
26
+# define _FILE_OFFSET_BITS 64
27
+# endif
28
+# define _LARGEFILE_SOURCE 1
29
+#endif
30
+
2031
#include <stdlib.h>
2132
#include <string.h>
2233
#include <stdio.h>
2334
#include <assert.h>
2435
#include "sqlite3.h"
@@ -58,11 +69,11 @@
5869
#define isatty(h) _isatty(h)
5970
#define access(f,m) _access((f),(m))
6071
#else
6172
/* Make sure isatty() has a prototype.
6273
*/
63
-extern int isatty();
74
+extern int isatty(int);
6475
#endif
6576
6677
#if defined(_WIN32_WCE)
6778
/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
6879
* thus we always assume that we have a console. That can be
@@ -325,22 +336,20 @@
325336
*/
326337
static char *local_getline(char *zPrompt, FILE *in){
327338
char *zLine;
328339
int nLine;
329340
int n;
330
- int eol;
331341
332342
if( zPrompt && *zPrompt ){
333343
printf("%s",zPrompt);
334344
fflush(stdout);
335345
}
336346
nLine = 100;
337347
zLine = malloc( nLine );
338348
if( zLine==0 ) return 0;
339349
n = 0;
340
- eol = 0;
341
- while( !eol ){
350
+ while( 1 ){
342351
if( n+100>nLine ){
343352
nLine = nLine*2 + 100;
344353
zLine = realloc(zLine, nLine);
345354
if( zLine==0 ) return 0;
346355
}
@@ -348,19 +357,18 @@
348357
if( n==0 ){
349358
free(zLine);
350359
return 0;
351360
}
352361
zLine[n] = 0;
353
- eol = 1;
354362
break;
355363
}
356364
while( zLine[n] ){ n++; }
357365
if( n>0 && zLine[n-1]=='\n' ){
358366
n--;
359367
if( n>0 && zLine[n-1]=='\r' ) n--;
360368
zLine[n] = 0;
361
- eol = 1;
369
+ break;
362370
}
363371
}
364372
zLine = realloc( zLine, n+1 );
365373
return zLine;
366374
}
@@ -405,10 +413,11 @@
405413
sqlite3 *db; /* The database */
406414
int echoOn; /* True to echo input commands */
407415
int statsOn; /* True to display memory stats before each finalize */
408416
int cnt; /* Number of records displayed so far */
409417
FILE *out; /* Write results here */
418
+ int nErr; /* Number of errors seen */
410419
int mode; /* An output mode setting */
411420
int writableSchema; /* True if PRAGMA writable_schema=ON */
412421
int showHeader; /* True to show column names in List or Column mode */
413422
char *zDestTable; /* Name of destination table when MODE_Insert */
414423
char separator[20]; /* Separator character for MODE_List */
@@ -930,31 +939,37 @@
930939
**
931940
** This is used, for example, to show the schema of the database by
932941
** querying the SQLITE_MASTER table.
933942
*/
934943
static int run_table_dump_query(
935
- FILE *out, /* Send output here */
936
- sqlite3 *db, /* Database to query */
937
- const char *zSelect, /* SELECT statement to extract content */
938
- const char *zFirstRow /* Print before first row, if not NULL */
944
+ struct callback_data *p, /* Query context */
945
+ const char *zSelect, /* SELECT statement to extract content */
946
+ const char *zFirstRow /* Print before first row, if not NULL */
939947
){
940948
sqlite3_stmt *pSelect;
941949
int rc;
942
- rc = sqlite3_prepare(db, zSelect, -1, &pSelect, 0);
950
+ rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
943951
if( rc!=SQLITE_OK || !pSelect ){
952
+ fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
953
+ p->nErr++;
944954
return rc;
945955
}
946956
rc = sqlite3_step(pSelect);
947957
while( rc==SQLITE_ROW ){
948958
if( zFirstRow ){
949
- fprintf(out, "%s", zFirstRow);
959
+ fprintf(p->out, "%s", zFirstRow);
950960
zFirstRow = 0;
951961
}
952
- fprintf(out, "%s;\n", sqlite3_column_text(pSelect, 0));
962
+ fprintf(p->out, "%s;\n", sqlite3_column_text(pSelect, 0));
953963
rc = sqlite3_step(pSelect);
954964
}
955
- return sqlite3_finalize(pSelect);
965
+ rc = sqlite3_finalize(pSelect);
966
+ if( rc!=SQLITE_OK ){
967
+ fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
968
+ p->nErr++;
969
+ }
970
+ return rc;
956971
}
957972
958973
/*
959974
** Allocate space and save off current error string.
960975
*/
@@ -1077,10 +1092,11 @@
10771092
struct callback_data *pArg, /* Pointer to struct callback_data */
10781093
char **pzErrMsg /* Error msg written here */
10791094
){
10801095
sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
10811096
int rc = SQLITE_OK; /* Return Code */
1097
+ int rc2;
10821098
const char *zLeftover; /* Tail of unprocessed SQL */
10831099
10841100
if( pzErrMsg ){
10851101
*pzErrMsg = NULL;
10861102
}
@@ -1170,11 +1186,12 @@
11701186
}
11711187
11721188
/* Finalize the statement just executed. If this fails, save a
11731189
** copy of the error message. Otherwise, set zSql to point to the
11741190
** next statement to execute. */
1175
- rc = sqlite3_finalize(pStmt);
1191
+ rc2 = sqlite3_finalize(pStmt);
1192
+ if( rc!=SQLITE_NOMEM ) rc = rc2;
11761193
if( rc==SQLITE_OK ){
11771194
zSql = zLeftover;
11781195
while( IsSpace(zSql[0]) ) zSql++;
11791196
}else if( pzErrMsg ){
11801197
*pzErrMsg = save_err_msg(db);
@@ -1276,14 +1293,14 @@
12761293
return 1;
12771294
}
12781295
zSelect = appendText(zSelect, "|| ')' FROM ", 0);
12791296
zSelect = appendText(zSelect, zTable, '"');
12801297
1281
- rc = run_table_dump_query(p->out, p->db, zSelect, zPrepStmt);
1298
+ rc = run_table_dump_query(p, zSelect, zPrepStmt);
12821299
if( rc==SQLITE_CORRUPT ){
12831300
zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
1284
- rc = run_table_dump_query(p->out, p->db, zSelect, 0);
1301
+ run_table_dump_query(p, zSelect, 0);
12851302
}
12861303
if( zSelect ) free(zSelect);
12871304
}
12881305
return 0;
12891306
}
@@ -1295,23 +1312,34 @@
12951312
** If we get a SQLITE_CORRUPT error, rerun the query after appending
12961313
** "ORDER BY rowid DESC" to the end.
12971314
*/
12981315
static int run_schema_dump_query(
12991316
struct callback_data *p,
1300
- const char *zQuery,
1301
- char **pzErrMsg
1317
+ const char *zQuery
13021318
){
13031319
int rc;
1304
- rc = sqlite3_exec(p->db, zQuery, dump_callback, p, pzErrMsg);
1320
+ char *zErr = 0;
1321
+ rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
13051322
if( rc==SQLITE_CORRUPT ){
13061323
char *zQ2;
13071324
int len = strlen30(zQuery);
1308
- if( pzErrMsg ) sqlite3_free(*pzErrMsg);
1325
+ fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1326
+ if( zErr ){
1327
+ fprintf(p->out, "/****** %s ******/\n", zErr);
1328
+ sqlite3_free(zErr);
1329
+ zErr = 0;
1330
+ }
13091331
zQ2 = malloc( len+100 );
13101332
if( zQ2==0 ) return rc;
13111333
sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
1312
- rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg);
1334
+ rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1335
+ if( rc ){
1336
+ fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1337
+ }else{
1338
+ rc = SQLITE_CORRUPT;
1339
+ }
1340
+ sqlite3_free(zErr);
13131341
free(zQ2);
13141342
}
13151343
return rc;
13161344
}
13171345
@@ -1553,29 +1581,29 @@
15531581
rc = 1;
15541582
}
15551583
}else
15561584
15571585
if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
1558
- char *zErrMsg = 0;
15591586
open_db(p);
15601587
/* When playing back a "dump", the content might appear in an order
15611588
** which causes immediate foreign key constraints to be violated.
15621589
** So disable foreign-key constraint enforcement to prevent problems. */
15631590
fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
15641591
fprintf(p->out, "BEGIN TRANSACTION;\n");
15651592
p->writableSchema = 0;
1566
- sqlite3_exec(p->db, "PRAGMA writable_schema=ON", 0, 0, 0);
1593
+ sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
1594
+ p->nErr = 0;
15671595
if( nArg==1 ){
15681596
run_schema_dump_query(p,
15691597
"SELECT name, type, sql FROM sqlite_master "
1570
- "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'", 0
1598
+ "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
15711599
);
15721600
run_schema_dump_query(p,
15731601
"SELECT name, type, sql FROM sqlite_master "
1574
- "WHERE name=='sqlite_sequence'", 0
1602
+ "WHERE name=='sqlite_sequence'"
15751603
);
1576
- run_table_dump_query(p->out, p->db,
1604
+ run_table_dump_query(p,
15771605
"SELECT sql FROM sqlite_master "
15781606
"WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
15791607
);
15801608
}else{
15811609
int i;
@@ -1582,12 +1610,12 @@
15821610
for(i=1; i<nArg; i++){
15831611
zShellStatic = azArg[i];
15841612
run_schema_dump_query(p,
15851613
"SELECT name, type, sql FROM sqlite_master "
15861614
"WHERE tbl_name LIKE shellstatic() AND type=='table'"
1587
- " AND sql NOT NULL", 0);
1588
- run_table_dump_query(p->out, p->db,
1615
+ " AND sql NOT NULL");
1616
+ run_table_dump_query(p,
15891617
"SELECT sql FROM sqlite_master "
15901618
"WHERE sql NOT NULL"
15911619
" AND type IN ('index','trigger','view')"
15921620
" AND tbl_name LIKE shellstatic()", 0
15931621
);
@@ -1596,17 +1624,13 @@
15961624
}
15971625
if( p->writableSchema ){
15981626
fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
15991627
p->writableSchema = 0;
16001628
}
1601
- sqlite3_exec(p->db, "PRAGMA writable_schema=OFF", 0, 0, 0);
1602
- if( zErrMsg ){
1603
- fprintf(stderr,"Error: %s\n", zErrMsg);
1604
- sqlite3_free(zErrMsg);
1605
- }else{
1606
- fprintf(p->out, "COMMIT;\n");
1607
- }
1629
+ sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
1630
+ sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
1631
+ fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
16081632
}else
16091633
16101634
if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
16111635
p->echoOn = booleanValue(azArg[1]);
16121636
}else
@@ -1735,11 +1759,10 @@
17351759
}
17361760
sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
17371761
zCommit = "COMMIT";
17381762
while( (zLine = local_getline(0, in))!=0 ){
17391763
char *z;
1740
- i = 0;
17411764
lineno++;
17421765
azCol[0] = zLine;
17431766
for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
17441767
if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
17451768
*z = 0;
@@ -2210,11 +2233,11 @@
22102233
for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
22112234
if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
22122235
if( testctrl<0 ){
22132236
testctrl = aCtrl[i].ctrlCode;
22142237
}else{
2215
- fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[i]);
2238
+ fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
22162239
testctrl = -1;
22172240
break;
22182241
}
22192242
}
22202243
}
@@ -2718,10 +2741,11 @@
27182741
** we do the actual processing of arguments later in a second pass.
27192742
*/
27202743
}else if( strcmp(argv[i],"-batch")==0 ){
27212744
stdin_is_interactive = 0;
27222745
}else if( strcmp(argv[i],"-heap")==0 ){
2746
+#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
27232747
int j, c;
27242748
const char *zSize;
27252749
sqlite3_int64 szHeap;
27262750
27272751
zSize = argv[++i];
@@ -2730,11 +2754,10 @@
27302754
if( c=='M' ){ szHeap *= 1000000; break; }
27312755
if( c=='K' ){ szHeap *= 1000; break; }
27322756
if( c=='G' ){ szHeap *= 1000000000; break; }
27332757
}
27342758
if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
2735
-#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
27362759
sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
27372760
#endif
27382761
#ifdef SQLITE_ENABLE_VFSTRACE
27392762
}else if( strcmp(argv[i],"-vfstrace")==0 ){
27402763
extern int vfstrace_register(
@@ -2771,11 +2794,11 @@
27712794
#ifndef SQLITE_OMIT_MEMORYDB
27722795
data.zDbFilename = ":memory:";
27732796
#else
27742797
data.zDbFilename = 0;
27752798
#endif
2776
- /***** Begin Fossil Patch *****/
2799
+ /***** Begin Fossil Patch *****/
27772800
{
27782801
extern void fossil_open(const char **);
27792802
fossil_open(&data.zDbFilename);
27802803
}
27812804
/***** End Fossil Patch *****/
27822805
--- src/shell.c
+++ src/shell.c
@@ -15,10 +15,21 @@
15 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16 /* This needs to come before any includes for MSVC compiler */
17 #define _CRT_SECURE_NO_WARNINGS
18 #endif
19
 
 
 
 
 
 
 
 
 
 
 
20 #include <stdlib.h>
21 #include <string.h>
22 #include <stdio.h>
23 #include <assert.h>
24 #include "sqlite3.h"
@@ -58,11 +69,11 @@
58 #define isatty(h) _isatty(h)
59 #define access(f,m) _access((f),(m))
60 #else
61 /* Make sure isatty() has a prototype.
62 */
63 extern int isatty();
64 #endif
65
66 #if defined(_WIN32_WCE)
67 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
68 * thus we always assume that we have a console. That can be
@@ -325,22 +336,20 @@
325 */
326 static char *local_getline(char *zPrompt, FILE *in){
327 char *zLine;
328 int nLine;
329 int n;
330 int eol;
331
332 if( zPrompt && *zPrompt ){
333 printf("%s",zPrompt);
334 fflush(stdout);
335 }
336 nLine = 100;
337 zLine = malloc( nLine );
338 if( zLine==0 ) return 0;
339 n = 0;
340 eol = 0;
341 while( !eol ){
342 if( n+100>nLine ){
343 nLine = nLine*2 + 100;
344 zLine = realloc(zLine, nLine);
345 if( zLine==0 ) return 0;
346 }
@@ -348,19 +357,18 @@
348 if( n==0 ){
349 free(zLine);
350 return 0;
351 }
352 zLine[n] = 0;
353 eol = 1;
354 break;
355 }
356 while( zLine[n] ){ n++; }
357 if( n>0 && zLine[n-1]=='\n' ){
358 n--;
359 if( n>0 && zLine[n-1]=='\r' ) n--;
360 zLine[n] = 0;
361 eol = 1;
362 }
363 }
364 zLine = realloc( zLine, n+1 );
365 return zLine;
366 }
@@ -405,10 +413,11 @@
405 sqlite3 *db; /* The database */
406 int echoOn; /* True to echo input commands */
407 int statsOn; /* True to display memory stats before each finalize */
408 int cnt; /* Number of records displayed so far */
409 FILE *out; /* Write results here */
 
410 int mode; /* An output mode setting */
411 int writableSchema; /* True if PRAGMA writable_schema=ON */
412 int showHeader; /* True to show column names in List or Column mode */
413 char *zDestTable; /* Name of destination table when MODE_Insert */
414 char separator[20]; /* Separator character for MODE_List */
@@ -930,31 +939,37 @@
930 **
931 ** This is used, for example, to show the schema of the database by
932 ** querying the SQLITE_MASTER table.
933 */
934 static int run_table_dump_query(
935 FILE *out, /* Send output here */
936 sqlite3 *db, /* Database to query */
937 const char *zSelect, /* SELECT statement to extract content */
938 const char *zFirstRow /* Print before first row, if not NULL */
939 ){
940 sqlite3_stmt *pSelect;
941 int rc;
942 rc = sqlite3_prepare(db, zSelect, -1, &pSelect, 0);
943 if( rc!=SQLITE_OK || !pSelect ){
 
 
944 return rc;
945 }
946 rc = sqlite3_step(pSelect);
947 while( rc==SQLITE_ROW ){
948 if( zFirstRow ){
949 fprintf(out, "%s", zFirstRow);
950 zFirstRow = 0;
951 }
952 fprintf(out, "%s;\n", sqlite3_column_text(pSelect, 0));
953 rc = sqlite3_step(pSelect);
954 }
955 return sqlite3_finalize(pSelect);
 
 
 
 
 
956 }
957
958 /*
959 ** Allocate space and save off current error string.
960 */
@@ -1077,10 +1092,11 @@
1077 struct callback_data *pArg, /* Pointer to struct callback_data */
1078 char **pzErrMsg /* Error msg written here */
1079 ){
1080 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1081 int rc = SQLITE_OK; /* Return Code */
 
1082 const char *zLeftover; /* Tail of unprocessed SQL */
1083
1084 if( pzErrMsg ){
1085 *pzErrMsg = NULL;
1086 }
@@ -1170,11 +1186,12 @@
1170 }
1171
1172 /* Finalize the statement just executed. If this fails, save a
1173 ** copy of the error message. Otherwise, set zSql to point to the
1174 ** next statement to execute. */
1175 rc = sqlite3_finalize(pStmt);
 
1176 if( rc==SQLITE_OK ){
1177 zSql = zLeftover;
1178 while( IsSpace(zSql[0]) ) zSql++;
1179 }else if( pzErrMsg ){
1180 *pzErrMsg = save_err_msg(db);
@@ -1276,14 +1293,14 @@
1276 return 1;
1277 }
1278 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1279 zSelect = appendText(zSelect, zTable, '"');
1280
1281 rc = run_table_dump_query(p->out, p->db, zSelect, zPrepStmt);
1282 if( rc==SQLITE_CORRUPT ){
1283 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
1284 rc = run_table_dump_query(p->out, p->db, zSelect, 0);
1285 }
1286 if( zSelect ) free(zSelect);
1287 }
1288 return 0;
1289 }
@@ -1295,23 +1312,34 @@
1295 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
1296 ** "ORDER BY rowid DESC" to the end.
1297 */
1298 static int run_schema_dump_query(
1299 struct callback_data *p,
1300 const char *zQuery,
1301 char **pzErrMsg
1302 ){
1303 int rc;
1304 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, pzErrMsg);
 
1305 if( rc==SQLITE_CORRUPT ){
1306 char *zQ2;
1307 int len = strlen30(zQuery);
1308 if( pzErrMsg ) sqlite3_free(*pzErrMsg);
 
 
 
 
 
1309 zQ2 = malloc( len+100 );
1310 if( zQ2==0 ) return rc;
1311 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
1312 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg);
 
 
 
 
 
 
1313 free(zQ2);
1314 }
1315 return rc;
1316 }
1317
@@ -1553,29 +1581,29 @@
1553 rc = 1;
1554 }
1555 }else
1556
1557 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
1558 char *zErrMsg = 0;
1559 open_db(p);
1560 /* When playing back a "dump", the content might appear in an order
1561 ** which causes immediate foreign key constraints to be violated.
1562 ** So disable foreign-key constraint enforcement to prevent problems. */
1563 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
1564 fprintf(p->out, "BEGIN TRANSACTION;\n");
1565 p->writableSchema = 0;
1566 sqlite3_exec(p->db, "PRAGMA writable_schema=ON", 0, 0, 0);
 
1567 if( nArg==1 ){
1568 run_schema_dump_query(p,
1569 "SELECT name, type, sql FROM sqlite_master "
1570 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'", 0
1571 );
1572 run_schema_dump_query(p,
1573 "SELECT name, type, sql FROM sqlite_master "
1574 "WHERE name=='sqlite_sequence'", 0
1575 );
1576 run_table_dump_query(p->out, p->db,
1577 "SELECT sql FROM sqlite_master "
1578 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
1579 );
1580 }else{
1581 int i;
@@ -1582,12 +1610,12 @@
1582 for(i=1; i<nArg; i++){
1583 zShellStatic = azArg[i];
1584 run_schema_dump_query(p,
1585 "SELECT name, type, sql FROM sqlite_master "
1586 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
1587 " AND sql NOT NULL", 0);
1588 run_table_dump_query(p->out, p->db,
1589 "SELECT sql FROM sqlite_master "
1590 "WHERE sql NOT NULL"
1591 " AND type IN ('index','trigger','view')"
1592 " AND tbl_name LIKE shellstatic()", 0
1593 );
@@ -1596,17 +1624,13 @@
1596 }
1597 if( p->writableSchema ){
1598 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
1599 p->writableSchema = 0;
1600 }
1601 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF", 0, 0, 0);
1602 if( zErrMsg ){
1603 fprintf(stderr,"Error: %s\n", zErrMsg);
1604 sqlite3_free(zErrMsg);
1605 }else{
1606 fprintf(p->out, "COMMIT;\n");
1607 }
1608 }else
1609
1610 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
1611 p->echoOn = booleanValue(azArg[1]);
1612 }else
@@ -1735,11 +1759,10 @@
1735 }
1736 sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
1737 zCommit = "COMMIT";
1738 while( (zLine = local_getline(0, in))!=0 ){
1739 char *z;
1740 i = 0;
1741 lineno++;
1742 azCol[0] = zLine;
1743 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
1744 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
1745 *z = 0;
@@ -2210,11 +2233,11 @@
2210 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
2211 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2212 if( testctrl<0 ){
2213 testctrl = aCtrl[i].ctrlCode;
2214 }else{
2215 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[i]);
2216 testctrl = -1;
2217 break;
2218 }
2219 }
2220 }
@@ -2718,10 +2741,11 @@
2718 ** we do the actual processing of arguments later in a second pass.
2719 */
2720 }else if( strcmp(argv[i],"-batch")==0 ){
2721 stdin_is_interactive = 0;
2722 }else if( strcmp(argv[i],"-heap")==0 ){
 
2723 int j, c;
2724 const char *zSize;
2725 sqlite3_int64 szHeap;
2726
2727 zSize = argv[++i];
@@ -2730,11 +2754,10 @@
2730 if( c=='M' ){ szHeap *= 1000000; break; }
2731 if( c=='K' ){ szHeap *= 1000; break; }
2732 if( c=='G' ){ szHeap *= 1000000000; break; }
2733 }
2734 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
2735 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
2736 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
2737 #endif
2738 #ifdef SQLITE_ENABLE_VFSTRACE
2739 }else if( strcmp(argv[i],"-vfstrace")==0 ){
2740 extern int vfstrace_register(
@@ -2771,11 +2794,11 @@
2771 #ifndef SQLITE_OMIT_MEMORYDB
2772 data.zDbFilename = ":memory:";
2773 #else
2774 data.zDbFilename = 0;
2775 #endif
2776 /***** Begin Fossil Patch *****/
2777 {
2778 extern void fossil_open(const char **);
2779 fossil_open(&data.zDbFilename);
2780 }
2781 /***** End Fossil Patch *****/
2782
--- src/shell.c
+++ src/shell.c
@@ -15,10 +15,21 @@
15 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16 /* This needs to come before any includes for MSVC compiler */
17 #define _CRT_SECURE_NO_WARNINGS
18 #endif
19
20 /*
21 ** Enable large-file support for fopen() and friends on unix.
22 */
23 #ifndef SQLITE_DISABLE_LFS
24 # define _LARGE_FILE 1
25 # ifndef _FILE_OFFSET_BITS
26 # define _FILE_OFFSET_BITS 64
27 # endif
28 # define _LARGEFILE_SOURCE 1
29 #endif
30
31 #include <stdlib.h>
32 #include <string.h>
33 #include <stdio.h>
34 #include <assert.h>
35 #include "sqlite3.h"
@@ -58,11 +69,11 @@
69 #define isatty(h) _isatty(h)
70 #define access(f,m) _access((f),(m))
71 #else
72 /* Make sure isatty() has a prototype.
73 */
74 extern int isatty(int);
75 #endif
76
77 #if defined(_WIN32_WCE)
78 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
79 * thus we always assume that we have a console. That can be
@@ -325,22 +336,20 @@
336 */
337 static char *local_getline(char *zPrompt, FILE *in){
338 char *zLine;
339 int nLine;
340 int n;
 
341
342 if( zPrompt && *zPrompt ){
343 printf("%s",zPrompt);
344 fflush(stdout);
345 }
346 nLine = 100;
347 zLine = malloc( nLine );
348 if( zLine==0 ) return 0;
349 n = 0;
350 while( 1 ){
 
351 if( n+100>nLine ){
352 nLine = nLine*2 + 100;
353 zLine = realloc(zLine, nLine);
354 if( zLine==0 ) return 0;
355 }
@@ -348,19 +357,18 @@
357 if( n==0 ){
358 free(zLine);
359 return 0;
360 }
361 zLine[n] = 0;
 
362 break;
363 }
364 while( zLine[n] ){ n++; }
365 if( n>0 && zLine[n-1]=='\n' ){
366 n--;
367 if( n>0 && zLine[n-1]=='\r' ) n--;
368 zLine[n] = 0;
369 break;
370 }
371 }
372 zLine = realloc( zLine, n+1 );
373 return zLine;
374 }
@@ -405,10 +413,11 @@
413 sqlite3 *db; /* The database */
414 int echoOn; /* True to echo input commands */
415 int statsOn; /* True to display memory stats before each finalize */
416 int cnt; /* Number of records displayed so far */
417 FILE *out; /* Write results here */
418 int nErr; /* Number of errors seen */
419 int mode; /* An output mode setting */
420 int writableSchema; /* True if PRAGMA writable_schema=ON */
421 int showHeader; /* True to show column names in List or Column mode */
422 char *zDestTable; /* Name of destination table when MODE_Insert */
423 char separator[20]; /* Separator character for MODE_List */
@@ -930,31 +939,37 @@
939 **
940 ** This is used, for example, to show the schema of the database by
941 ** querying the SQLITE_MASTER table.
942 */
943 static int run_table_dump_query(
944 struct callback_data *p, /* Query context */
945 const char *zSelect, /* SELECT statement to extract content */
946 const char *zFirstRow /* Print before first row, if not NULL */
 
947 ){
948 sqlite3_stmt *pSelect;
949 int rc;
950 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
951 if( rc!=SQLITE_OK || !pSelect ){
952 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
953 p->nErr++;
954 return rc;
955 }
956 rc = sqlite3_step(pSelect);
957 while( rc==SQLITE_ROW ){
958 if( zFirstRow ){
959 fprintf(p->out, "%s", zFirstRow);
960 zFirstRow = 0;
961 }
962 fprintf(p->out, "%s;\n", sqlite3_column_text(pSelect, 0));
963 rc = sqlite3_step(pSelect);
964 }
965 rc = sqlite3_finalize(pSelect);
966 if( rc!=SQLITE_OK ){
967 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
968 p->nErr++;
969 }
970 return rc;
971 }
972
973 /*
974 ** Allocate space and save off current error string.
975 */
@@ -1077,10 +1092,11 @@
1092 struct callback_data *pArg, /* Pointer to struct callback_data */
1093 char **pzErrMsg /* Error msg written here */
1094 ){
1095 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1096 int rc = SQLITE_OK; /* Return Code */
1097 int rc2;
1098 const char *zLeftover; /* Tail of unprocessed SQL */
1099
1100 if( pzErrMsg ){
1101 *pzErrMsg = NULL;
1102 }
@@ -1170,11 +1186,12 @@
1186 }
1187
1188 /* Finalize the statement just executed. If this fails, save a
1189 ** copy of the error message. Otherwise, set zSql to point to the
1190 ** next statement to execute. */
1191 rc2 = sqlite3_finalize(pStmt);
1192 if( rc!=SQLITE_NOMEM ) rc = rc2;
1193 if( rc==SQLITE_OK ){
1194 zSql = zLeftover;
1195 while( IsSpace(zSql[0]) ) zSql++;
1196 }else if( pzErrMsg ){
1197 *pzErrMsg = save_err_msg(db);
@@ -1276,14 +1293,14 @@
1293 return 1;
1294 }
1295 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1296 zSelect = appendText(zSelect, zTable, '"');
1297
1298 rc = run_table_dump_query(p, zSelect, zPrepStmt);
1299 if( rc==SQLITE_CORRUPT ){
1300 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
1301 run_table_dump_query(p, zSelect, 0);
1302 }
1303 if( zSelect ) free(zSelect);
1304 }
1305 return 0;
1306 }
@@ -1295,23 +1312,34 @@
1312 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
1313 ** "ORDER BY rowid DESC" to the end.
1314 */
1315 static int run_schema_dump_query(
1316 struct callback_data *p,
1317 const char *zQuery
 
1318 ){
1319 int rc;
1320 char *zErr = 0;
1321 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
1322 if( rc==SQLITE_CORRUPT ){
1323 char *zQ2;
1324 int len = strlen30(zQuery);
1325 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1326 if( zErr ){
1327 fprintf(p->out, "/****** %s ******/\n", zErr);
1328 sqlite3_free(zErr);
1329 zErr = 0;
1330 }
1331 zQ2 = malloc( len+100 );
1332 if( zQ2==0 ) return rc;
1333 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
1334 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1335 if( rc ){
1336 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1337 }else{
1338 rc = SQLITE_CORRUPT;
1339 }
1340 sqlite3_free(zErr);
1341 free(zQ2);
1342 }
1343 return rc;
1344 }
1345
@@ -1553,29 +1581,29 @@
1581 rc = 1;
1582 }
1583 }else
1584
1585 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
 
1586 open_db(p);
1587 /* When playing back a "dump", the content might appear in an order
1588 ** which causes immediate foreign key constraints to be violated.
1589 ** So disable foreign-key constraint enforcement to prevent problems. */
1590 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
1591 fprintf(p->out, "BEGIN TRANSACTION;\n");
1592 p->writableSchema = 0;
1593 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
1594 p->nErr = 0;
1595 if( nArg==1 ){
1596 run_schema_dump_query(p,
1597 "SELECT name, type, sql FROM sqlite_master "
1598 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
1599 );
1600 run_schema_dump_query(p,
1601 "SELECT name, type, sql FROM sqlite_master "
1602 "WHERE name=='sqlite_sequence'"
1603 );
1604 run_table_dump_query(p,
1605 "SELECT sql FROM sqlite_master "
1606 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
1607 );
1608 }else{
1609 int i;
@@ -1582,12 +1610,12 @@
1610 for(i=1; i<nArg; i++){
1611 zShellStatic = azArg[i];
1612 run_schema_dump_query(p,
1613 "SELECT name, type, sql FROM sqlite_master "
1614 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
1615 " AND sql NOT NULL");
1616 run_table_dump_query(p,
1617 "SELECT sql FROM sqlite_master "
1618 "WHERE sql NOT NULL"
1619 " AND type IN ('index','trigger','view')"
1620 " AND tbl_name LIKE shellstatic()", 0
1621 );
@@ -1596,17 +1624,13 @@
1624 }
1625 if( p->writableSchema ){
1626 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
1627 p->writableSchema = 0;
1628 }
1629 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
1630 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
1631 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
 
 
 
 
1632 }else
1633
1634 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
1635 p->echoOn = booleanValue(azArg[1]);
1636 }else
@@ -1735,11 +1759,10 @@
1759 }
1760 sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
1761 zCommit = "COMMIT";
1762 while( (zLine = local_getline(0, in))!=0 ){
1763 char *z;
 
1764 lineno++;
1765 azCol[0] = zLine;
1766 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
1767 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
1768 *z = 0;
@@ -2210,11 +2233,11 @@
2233 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
2234 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2235 if( testctrl<0 ){
2236 testctrl = aCtrl[i].ctrlCode;
2237 }else{
2238 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
2239 testctrl = -1;
2240 break;
2241 }
2242 }
2243 }
@@ -2718,10 +2741,11 @@
2741 ** we do the actual processing of arguments later in a second pass.
2742 */
2743 }else if( strcmp(argv[i],"-batch")==0 ){
2744 stdin_is_interactive = 0;
2745 }else if( strcmp(argv[i],"-heap")==0 ){
2746 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
2747 int j, c;
2748 const char *zSize;
2749 sqlite3_int64 szHeap;
2750
2751 zSize = argv[++i];
@@ -2730,11 +2754,10 @@
2754 if( c=='M' ){ szHeap *= 1000000; break; }
2755 if( c=='K' ){ szHeap *= 1000; break; }
2756 if( c=='G' ){ szHeap *= 1000000000; break; }
2757 }
2758 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
 
2759 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
2760 #endif
2761 #ifdef SQLITE_ENABLE_VFSTRACE
2762 }else if( strcmp(argv[i],"-vfstrace")==0 ){
2763 extern int vfstrace_register(
@@ -2771,11 +2794,11 @@
2794 #ifndef SQLITE_OMIT_MEMORYDB
2795 data.zDbFilename = ":memory:";
2796 #else
2797 data.zDbFilename = 0;
2798 #endif
2799 /***** Begin Fossil Patch *****/
2800 {
2801 extern void fossil_open(const char **);
2802 fossil_open(&data.zDbFilename);
2803 }
2804 /***** End Fossil Patch *****/
2805
+240 -230
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -656,11 +656,11 @@
656656
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
657657
** [sqlite_version()] and [sqlite_source_id()].
658658
*/
659659
#define SQLITE_VERSION "3.7.9"
660660
#define SQLITE_VERSION_NUMBER 3007009
661
-#define SQLITE_SOURCE_ID "2011-10-11 20:41:54 b94a80a832777f0e639f6a81fcfe169bf970a8c0"
661
+#define SQLITE_SOURCE_ID "2011-10-15 00:16:30 39408702a989f907261c298bf0947f3e68bd10fe"
662662
663663
/*
664664
** CAPI3REF: Run-Time Library Version Numbers
665665
** KEYWORDS: sqlite3_version, sqlite3_sourceid
666666
**
@@ -3351,11 +3351,12 @@
33513351
** zSql string ends at either the first '\000' or '\u0000' character or
33523352
** the nByte-th byte, whichever comes first. If the caller knows
33533353
** that the supplied string is nul-terminated, then there is a small
33543354
** performance advantage to be gained by passing an nByte parameter that
33553355
** is equal to the number of bytes in the input string <i>including</i>
3356
-** the nul-terminator bytes.
3356
+** the nul-terminator bytes as this saves SQLite from having to
3357
+** make a copy of the input string.
33573358
**
33583359
** ^If pzTail is not NULL then *pzTail is made to point to the first byte
33593360
** past the end of the first SQL statement in zSql. These routines only
33603361
** compile the first statement in zSql, so *pzTail is left pointing to
33613362
** what remains uncompiled.
@@ -3572,10 +3573,17 @@
35723573
** ^(In those routines that have a fourth argument, its value is the
35733574
** number of bytes in the parameter. To be clear: the value is the
35743575
** number of <u>bytes</u> in the value, not the number of characters.)^
35753576
** ^If the fourth parameter is negative, the length of the string is
35763577
** the number of bytes up to the first zero terminator.
3578
+** If a non-negative fourth parameter is provided to sqlite3_bind_text()
3579
+** or sqlite3_bind_text16() then that parameter must be the byte offset
3580
+** where the NUL terminator would occur assuming the string were NUL
3581
+** terminated. If any NUL characters occur at byte offsets less than
3582
+** the value of the fourth parameter then the resulting string value will
3583
+** contain embedded NULs. The result of expressions involving strings
3584
+** with embedded NULs is undefined.
35773585
**
35783586
** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
35793587
** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
35803588
** string after SQLite has finished with it. ^The destructor is called
35813589
** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(),
@@ -4590,11 +4598,16 @@
45904598
** is negative, then SQLite takes result text from the 2nd parameter
45914599
** through the first zero character.
45924600
** ^If the 3rd parameter to the sqlite3_result_text* interfaces
45934601
** is non-negative, then as many bytes (not characters) of the text
45944602
** pointed to by the 2nd parameter are taken as the application-defined
4595
-** function result.
4603
+** function result. If the 3rd parameter is non-negative, then it
4604
+** must be the byte offset into the string where the NUL terminator would
4605
+** appear if the string where NUL terminated. If any NUL characters occur
4606
+** in the string at a byte offset that is less than the value of the 3rd
4607
+** parameter, then the resulting string will contain embedded NULs and the
4608
+** result of expressions operating on strings with embedded NULs is undefined.
45964609
** ^If the 4th parameter to the sqlite3_result_text* interfaces
45974610
** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that
45984611
** function as the destructor on the text or BLOB result when it has
45994612
** finished using that result.
46004613
** ^If the 4th parameter to the sqlite3_result_text* interfaces or to
@@ -9315,18 +9328,21 @@
93159328
/*
93169329
** If this is a no-op implementation, implement everything as macros.
93179330
*/
93189331
#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8)
93199332
#define sqlite3_mutex_free(X)
9320
-#define sqlite3_mutex_enter(X)
9333
+#define sqlite3_mutex_enter(X)
93219334
#define sqlite3_mutex_try(X) SQLITE_OK
9322
-#define sqlite3_mutex_leave(X)
9335
+#define sqlite3_mutex_leave(X)
93239336
#define sqlite3_mutex_held(X) ((void)(X),1)
93249337
#define sqlite3_mutex_notheld(X) ((void)(X),1)
93259338
#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8)
93269339
#define sqlite3MutexInit() SQLITE_OK
93279340
#define sqlite3MutexEnd()
9341
+#define MUTEX_LOGIC(X)
9342
+#else
9343
+#define MUTEX_LOGIC(X) X
93289344
#endif /* defined(SQLITE_MUTEX_OMIT) */
93299345
93309346
/************** End of mutex.h ***********************************************/
93319347
/************** Continuing where we left off in sqliteInt.h ******************/
93329348
@@ -11754,19 +11770,21 @@
1175411770
# define sqlite3VtabInSync(db) 0
1175511771
# define sqlite3VtabLock(X)
1175611772
# define sqlite3VtabUnlock(X)
1175711773
# define sqlite3VtabUnlockList(X)
1175811774
# define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK
11775
+# define sqlite3GetVTable(X,Y) ((VTable*)0)
1175911776
#else
1176011777
SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table*);
1176111778
SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, char **);
1176211779
SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db);
1176311780
SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db);
1176411781
SQLITE_PRIVATE void sqlite3VtabLock(VTable *);
1176511782
SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *);
1176611783
SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*);
1176711784
SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int);
11785
+SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*);
1176811786
# define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
1176911787
#endif
1177011788
SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*);
1177111789
SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*);
1177211790
SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*);
@@ -11782,11 +11800,10 @@
1178211800
SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
1178311801
SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*);
1178411802
SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
1178511803
SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
1178611804
SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*);
11787
-SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*);
1178811805
SQLITE_PRIVATE const char *sqlite3JournalModename(int);
1178911806
SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int, int, int*, int*);
1179011807
SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int);
1179111808
1179211809
/* Declarations for functions in fkey.c. All of these are replaced by
@@ -13558,16 +13575,22 @@
1355813575
}
1355913576
return 0;
1356013577
}
1356113578
1356213579
/*
13563
-** Set the time to the current time reported by the VFS
13580
+** Set the time to the current time reported by the VFS.
13581
+**
13582
+** Return the number of errors.
1356413583
*/
13565
-static void setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
13584
+static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
1356613585
sqlite3 *db = sqlite3_context_db_handle(context);
13567
- sqlite3OsCurrentTimeInt64(db->pVfs, &p->iJD);
13568
- p->validJD = 1;
13586
+ if( sqlite3OsCurrentTimeInt64(db->pVfs, &p->iJD)==SQLITE_OK ){
13587
+ p->validJD = 1;
13588
+ return 0;
13589
+ }else{
13590
+ return 1;
13591
+ }
1356913592
}
1357013593
1357113594
/*
1357213595
** Attempt to parse the given string into a Julian Day Number. Return
1357313596
** the number of errors.
@@ -13593,12 +13616,11 @@
1359313616
if( parseYyyyMmDd(zDate,p)==0 ){
1359413617
return 0;
1359513618
}else if( parseHhMmSs(zDate, p)==0 ){
1359613619
return 0;
1359713620
}else if( sqlite3StrICmp(zDate,"now")==0){
13598
- setDateTimeToCurrent(context, p);
13599
- return 0;
13621
+ return setDateTimeToCurrent(context, p);
1360013622
}else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){
1360113623
p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5);
1360213624
p->validJD = 1;
1360313625
return 0;
1360413626
}
@@ -14021,12 +14043,13 @@
1402114043
int i;
1402214044
const unsigned char *z;
1402314045
int eType;
1402414046
memset(p, 0, sizeof(*p));
1402514047
if( argc==0 ){
14026
- setDateTimeToCurrent(context, p);
14027
- }else if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
14048
+ return setDateTimeToCurrent(context, p);
14049
+ }
14050
+ if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
1402814051
|| eType==SQLITE_INTEGER ){
1402914052
p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5);
1403014053
p->validJD = 1;
1403114054
}else{
1403214055
z = sqlite3_value_text(argv[0]);
@@ -14334,35 +14357,32 @@
1433414357
){
1433514358
time_t t;
1433614359
char *zFormat = (char *)sqlite3_user_data(context);
1433714360
sqlite3 *db;
1433814361
sqlite3_int64 iT;
14362
+ struct tm *pTm;
14363
+ struct tm sNow;
1433914364
char zBuf[20];
1434014365
1434114366
UNUSED_PARAMETER(argc);
1434214367
UNUSED_PARAMETER(argv);
1434314368
1434414369
db = sqlite3_context_db_handle(context);
14345
- sqlite3OsCurrentTimeInt64(db->pVfs, &iT);
14370
+ if( sqlite3OsCurrentTimeInt64(db->pVfs, &iT) ) return;
1434614371
t = iT/1000 - 10000*(sqlite3_int64)21086676;
1434714372
#ifdef HAVE_GMTIME_R
14348
- {
14349
- struct tm sNow;
14350
- gmtime_r(&t, &sNow);
14373
+ pTm = gmtime_r(&t, &sNow);
14374
+#else
14375
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14376
+ pTm = gmtime(&t);
14377
+ if( pTm ) memcpy(&sNow, pTm, sizeof(sNow));
14378
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14379
+#endif
14380
+ if( pTm ){
1435114381
strftime(zBuf, 20, zFormat, &sNow);
14352
- }
14353
-#else
14354
- {
14355
- struct tm *pTm;
14356
- sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14357
- pTm = gmtime(&t);
14358
- strftime(zBuf, 20, zFormat, pTm);
14359
- sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14360
- }
14361
-#endif
14362
-
14363
- sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
14382
+ sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
14383
+ }
1436414384
}
1436514385
#endif
1436614386
1436714387
/*
1436814388
** This function registered all of the above C functions as SQL
@@ -14693,16 +14713,16 @@
1469314713
** Register a VFS with the system. It is harmless to register the same
1469414714
** VFS multiple times. The new VFS becomes the default if makeDflt is
1469514715
** true.
1469614716
*/
1469714717
SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){
14698
- sqlite3_mutex *mutex = 0;
14718
+ MUTEX_LOGIC(sqlite3_mutex *mutex;)
1469914719
#ifndef SQLITE_OMIT_AUTOINIT
1470014720
int rc = sqlite3_initialize();
1470114721
if( rc ) return rc;
1470214722
#endif
14703
- mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
14723
+ MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
1470414724
sqlite3_mutex_enter(mutex);
1470514725
vfsUnlink(pVfs);
1470614726
if( makeDflt || vfsList==0 ){
1470714727
pVfs->pNext = vfsList;
1470814728
vfsList = pVfs;
@@ -18946,52 +18966,14 @@
1894618966
** an historical reference. Most of the "enhancements" have been backed
1894718967
** out so that the functionality is now the same as standard printf().
1894818968
**
1894918969
**************************************************************************
1895018970
**
18951
-** The following modules is an enhanced replacement for the "printf" subroutines
18952
-** found in the standard C library. The following enhancements are
18953
-** supported:
18954
-**
18955
-** + Additional functions. The standard set of "printf" functions
18956
-** includes printf, fprintf, sprintf, vprintf, vfprintf, and
18957
-** vsprintf. This module adds the following:
18958
-**
18959
-** * snprintf -- Works like sprintf, but has an extra argument
18960
-** which is the size of the buffer written to.
18961
-**
18962
-** * mprintf -- Similar to sprintf. Writes output to memory
18963
-** obtained from malloc.
18964
-**
18965
-** * xprintf -- Calls a function to dispose of output.
18966
-**
18967
-** * nprintf -- No output, but returns the number of characters
18968
-** that would have been output by printf.
18969
-**
18970
-** * A v- version (ex: vsnprintf) of every function is also
18971
-** supplied.
18972
-**
18973
-** + A few extensions to the formatting notation are supported:
18974
-**
18975
-** * The "=" flag (similar to "-") causes the output to be
18976
-** be centered in the appropriately sized field.
18977
-**
18978
-** * The %b field outputs an integer in binary notation.
18979
-**
18980
-** * The %c field now accepts a precision. The character output
18981
-** is repeated by the number of times the precision specifies.
18982
-**
18983
-** * The %' field works like %c, but takes as its character the
18984
-** next character of the format string, instead of the next
18985
-** argument. For example, printf("%.78'-") prints 78 minus
18986
-** signs, the same as printf("%.78c",'-').
18987
-**
18988
-** + When compiled using GCC on a SPARC, this version of printf is
18989
-** faster than the library printf for SUN OS 4.1.
18990
-**
18991
-** + All functions are fully reentrant.
18992
-**
18971
+** This file contains code for a set of "printf"-like routines. These
18972
+** routines format strings much like the printf() from the standard C
18973
+** library, though the implementation here has enhancements to support
18974
+** SQLlite.
1899318975
*/
1899418976
1899518977
/*
1899618978
** Conversion types fall into various categories as defined by the
1899718979
** following enumeration.
@@ -19125,43 +19107,19 @@
1912519107
}
1912619108
}
1912719109
1912819110
/*
1912919111
** On machines with a small stack size, you can redefine the
19130
-** SQLITE_PRINT_BUF_SIZE to be less than 350.
19112
+** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired.
1913119113
*/
1913219114
#ifndef SQLITE_PRINT_BUF_SIZE
1913319115
# define SQLITE_PRINT_BUF_SIZE 70
1913419116
#endif
1913519117
#define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */
1913619118
1913719119
/*
19138
-** The root program. All variations call this core.
19139
-**
19140
-** INPUTS:
19141
-** func This is a pointer to a function taking three arguments
19142
-** 1. A pointer to anything. Same as the "arg" parameter.
19143
-** 2. A pointer to the list of characters to be output
19144
-** (Note, this list is NOT null terminated.)
19145
-** 3. An integer number of characters to be output.
19146
-** (Note: This number might be zero.)
19147
-**
19148
-** arg This is the pointer to anything which will be passed as the
19149
-** first argument to "func". Use it for whatever you like.
19150
-**
19151
-** fmt This is the format string, as in the usual print.
19152
-**
19153
-** ap This is a pointer to a list of arguments. Same as in
19154
-** vfprint.
19155
-**
19156
-** OUTPUTS:
19157
-** The return value is the total number of characters sent to
19158
-** the function "func". Returns -1 on a error.
19159
-**
19160
-** Note that the order in which automatic variables are declared below
19161
-** seems to make a big difference in determining how fast this beast
19162
-** will run.
19120
+** Render a string given by "fmt" into the StrAccum object.
1916319121
*/
1916419122
SQLITE_PRIVATE void sqlite3VXPrintf(
1916519123
StrAccum *pAccum, /* Accumulate results here */
1916619124
int useExtended, /* Allow extended %-conversions */
1916719125
const char *fmt, /* Format string */
@@ -19180,28 +19138,27 @@
1918019138
etByte flag_altform2; /* True if "!" flag is present */
1918119139
etByte flag_zeropad; /* True if field width constant starts with zero */
1918219140
etByte flag_long; /* True if "l" flag is present */
1918319141
etByte flag_longlong; /* True if the "ll" flag is present */
1918419142
etByte done; /* Loop termination flag */
19143
+ etByte xtype = 0; /* Conversion paradigm */
19144
+ char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
1918519145
sqlite_uint64 longvalue; /* Value for integer types */
1918619146
LONGDOUBLE_TYPE realvalue; /* Value for real types */
1918719147
const et_info *infop; /* Pointer to the appropriate info structure */
19188
- char buf[etBUFSIZE]; /* Conversion buffer */
1918919148
char *zOut; /* Rendering buffer */
1919019149
int nOut; /* Size of the rendering buffer */
19191
- char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
19192
- etByte xtype = 0; /* Conversion paradigm */
19193
- char *zExtra; /* Extra memory used for etTCLESCAPE conversions */
19150
+ char *zExtra; /* Malloced memory used by some conversion */
1919419151
#ifndef SQLITE_OMIT_FLOATING_POINT
1919519152
int exp, e2; /* exponent of real numbers */
19153
+ int nsd; /* Number of significant digits returned */
1919619154
double rounder; /* Used for rounding floating point values */
1919719155
etByte flag_dp; /* True if decimal point should be shown */
1919819156
etByte flag_rtz; /* True if trailing zeros should be removed */
19199
- int nsd; /* Number of significant digits returned */
1920019157
#endif
19158
+ char buf[etBUFSIZE]; /* Conversion buffer */
1920119159
19202
- length = 0;
1920319160
bufpt = 0;
1920419161
for(; (c=(*fmt))!=0; ++fmt){
1920519162
if( c!='%' ){
1920619163
int amt;
1920719164
bufpt = (char *)fmt;
@@ -19692,10 +19649,11 @@
1969219649
if( p->tooBig | p->mallocFailed ){
1969319650
testcase(p->tooBig);
1969419651
testcase(p->mallocFailed);
1969519652
return;
1969619653
}
19654
+ assert( p->zText!=0 || p->nChar==0 );
1969719655
if( N<0 ){
1969819656
N = sqlite3Strlen30(z);
1969919657
}
1970019658
if( N==0 || NEVER(z==0) ){
1970119659
return;
@@ -19723,19 +19681,20 @@
1972319681
zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc);
1972419682
}else{
1972519683
zNew = sqlite3_realloc(zOld, p->nAlloc);
1972619684
}
1972719685
if( zNew ){
19728
- if( zOld==0 ) memcpy(zNew, p->zText, p->nChar);
19686
+ if( zOld==0 && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar);
1972919687
p->zText = zNew;
1973019688
}else{
1973119689
p->mallocFailed = 1;
1973219690
sqlite3StrAccumReset(p);
1973319691
return;
1973419692
}
1973519693
}
1973619694
}
19695
+ assert( p->zText );
1973719696
memcpy(&p->zText[p->nChar], z, N);
1973819697
p->nChar += N;
1973919698
}
1974019699
1974119700
/*
@@ -25172,11 +25131,11 @@
2517225131
return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
2517325132
}
2517425133
#endif
2517525134
2517625135
25177
-#ifdef SQLITE_DEBUG
25136
+#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
2517825137
/*
2517925138
** Helper function for printing out trace information from debugging
2518025139
** binaries. This returns the string represetation of the supplied
2518125140
** integer lock-type.
2518225141
*/
@@ -26007,18 +25966,18 @@
2600725966
** locking a random byte from a range, concurrent SHARED locks may exist
2600825967
** even if the locking primitive used is always a write-lock.
2600925968
*/
2601025969
int rc = SQLITE_OK;
2601125970
unixFile *pFile = (unixFile*)id;
26012
- unixInodeInfo *pInode = pFile->pInode;
25971
+ unixInodeInfo *pInode;
2601325972
struct flock lock;
2601425973
int tErrno = 0;
2601525974
2601625975
assert( pFile );
2601725976
OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h,
2601825977
azFileLock(eFileLock), azFileLock(pFile->eFileLock),
26019
- azFileLock(pInode->eFileLock), pInode->nShared , getpid()));
25978
+ azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared , getpid()));
2602025979
2602125980
/* If there is already a lock of this type or more restrictive on the
2602225981
** unixFile, do nothing. Don't use the end_lock: exit path, as
2602325982
** unixEnterMutex() hasn't been called yet.
2602425983
*/
@@ -26218,11 +26177,10 @@
2621826177
static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
2621926178
unixFile *pFile = (unixFile*)id;
2622026179
unixInodeInfo *pInode;
2622126180
struct flock lock;
2622226181
int rc = SQLITE_OK;
26223
- int h;
2622426182
2622526183
assert( pFile );
2622626184
OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock,
2622726185
pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared,
2622826186
getpid()));
@@ -26230,18 +26188,14 @@
2623026188
assert( eFileLock<=SHARED_LOCK );
2623126189
if( pFile->eFileLock<=eFileLock ){
2623226190
return SQLITE_OK;
2623326191
}
2623426192
unixEnterMutex();
26235
- h = pFile->h;
2623626193
pInode = pFile->pInode;
2623726194
assert( pInode->nShared!=0 );
2623826195
if( pFile->eFileLock>SHARED_LOCK ){
2623926196
assert( pInode->eFileLock==pFile->eFileLock );
26240
- SimulateIOErrorBenign(1);
26241
- SimulateIOError( h=(-1) )
26242
- SimulateIOErrorBenign(0);
2624326197
2624426198
#ifndef NDEBUG
2624526199
/* When reducing a lock such that other processes can start
2624626200
** reading the database file again, make sure that the
2624726201
** transaction counter was updated if any part of the database
@@ -26248,15 +26202,10 @@
2624826202
** file changed. If the transaction counter is not updated,
2624926203
** other connections to the same file might not realize that
2625026204
** the file has changed and hence might not know to flush their
2625126205
** cache. The use of a stale cache can lead to database corruption.
2625226206
*/
26253
-#if 0
26254
- assert( pFile->inNormalWrite==0
26255
- || pFile->dbUpdate==0
26256
- || pFile->transCntrChng==1 );
26257
-#endif
2625826207
pFile->inNormalWrite = 0;
2625926208
#endif
2626026209
2626126210
/* downgrading to a shared lock on NFS involves clearing the write lock
2626226211
** before establishing the readlock - to avoid a race condition we downgrade
@@ -26354,13 +26303,10 @@
2635426303
pInode->nShared--;
2635526304
if( pInode->nShared==0 ){
2635626305
lock.l_type = F_UNLCK;
2635726306
lock.l_whence = SEEK_SET;
2635826307
lock.l_start = lock.l_len = 0L;
26359
- SimulateIOErrorBenign(1);
26360
- SimulateIOError( h=(-1) )
26361
- SimulateIOErrorBenign(0);
2636226308
if( unixFileLock(pFile, &lock)==0 ){
2636326309
pInode->eFileLock = NO_LOCK;
2636426310
}else{
2636526311
rc = SQLITE_IOERR_UNLOCK;
2636626312
pFile->lastErrno = errno;
@@ -29191,10 +29137,13 @@
2919129137
assert( zFilename==0 || zFilename[0]=='/'
2919229138
|| pVfs->pAppData==(void*)&autolockIoFinder );
2919329139
#else
2919429140
assert( zFilename==0 || zFilename[0]=='/' );
2919529141
#endif
29142
+
29143
+ /* No locking occurs in temporary files */
29144
+ assert( zFilename!=0 || noLock );
2919629145
2919729146
OSTRACE(("OPEN %-3d %s\n", h, zFilename));
2919829147
pNew->h = h;
2919929148
pNew->zPath = zFilename;
2920029149
if( memcmp(pVfs->zName,"unix-excl",10)==0 ){
@@ -29293,10 +29242,11 @@
2929329242
/* Dotfile locking uses the file path so it needs to be included in
2929429243
** the dotlockLockingContext
2929529244
*/
2929629245
char *zLockFile;
2929729246
int nFilename;
29247
+ assert( zFilename!=0 );
2929829248
nFilename = (int)strlen(zFilename) + 6;
2929929249
zLockFile = (char *)sqlite3_malloc(nFilename);
2930029250
if( zLockFile==0 ){
2930129251
rc = SQLITE_NOMEM;
2930229252
}else{
@@ -30072,14 +30022,16 @@
3007230022
** the current time and date as a Julian Day number times 86_400_000. In
3007330023
** other words, write into *piNow the number of milliseconds since the Julian
3007430024
** epoch of noon in Greenwich on November 24, 4714 B.C according to the
3007530025
** proleptic Gregorian calendar.
3007630026
**
30077
-** On success, return 0. Return 1 if the time and date cannot be found.
30027
+** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date
30028
+** cannot be found.
3007830029
*/
3007930030
static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){
3008030031
static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
30032
+ int rc = SQLITE_OK;
3008130033
#if defined(NO_GETTOD)
3008230034
time_t t;
3008330035
time(&t);
3008430036
*piNow = ((sqlite3_int64)t)*1000 + unixEpoch;
3008530037
#elif OS_VXWORKS
@@ -30086,34 +30038,38 @@
3008630038
struct timespec sNow;
3008730039
clock_gettime(CLOCK_REALTIME, &sNow);
3008830040
*piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000;
3008930041
#else
3009030042
struct timeval sNow;
30091
- gettimeofday(&sNow, 0);
30092
- *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000;
30043
+ if( gettimeofday(&sNow, 0)==0 ){
30044
+ *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000;
30045
+ }else{
30046
+ rc = SQLITE_ERROR;
30047
+ }
3009330048
#endif
3009430049
3009530050
#ifdef SQLITE_TEST
3009630051
if( sqlite3_current_time ){
3009730052
*piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
3009830053
}
3009930054
#endif
3010030055
UNUSED_PARAMETER(NotUsed);
30101
- return 0;
30056
+ return rc;
3010230057
}
3010330058
3010430059
/*
3010530060
** Find the current time (in Universal Coordinated Time). Write the
3010630061
** current time and date as a Julian Day number into *prNow and
3010730062
** return 0. Return 1 if the time and date cannot be found.
3010830063
*/
3010930064
static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){
30110
- sqlite3_int64 i;
30065
+ sqlite3_int64 i = 0;
30066
+ int rc;
3011130067
UNUSED_PARAMETER(NotUsed);
30112
- unixCurrentTimeInt64(0, &i);
30068
+ rc = unixCurrentTimeInt64(0, &i);
3011330069
*prNow = i/86400000.0;
30114
- return 0;
30070
+ return rc;
3011530071
}
3011630072
3011730073
/*
3011830074
** We added the xGetLastError() method with the intention of providing
3011930075
** better low-level error messages when operating-system problems come up
@@ -34612,11 +34568,11 @@
3461234568
}
3461334569
static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){
3461434570
UNUSED_PARAMETER(pVfs);
3461534571
getLastErrorMsg(nBuf, zBufOut);
3461634572
}
34617
-void (*winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol))(void){
34573
+static void (*winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol))(void){
3461834574
UNUSED_PARAMETER(pVfs);
3461934575
#if SQLITE_OS_WINCE
3462034576
/* The GetProcAddressA() routine is only available on wince. */
3462134577
return (void(*)(void))GetProcAddressA((HANDLE)pHandle, zSymbol);
3462234578
#else
@@ -34623,11 +34579,11 @@
3462334579
/* All other windows platforms expect GetProcAddress() to take
3462434580
** an Ansi string regardless of the _UNICODE setting */
3462534581
return (void(*)(void))GetProcAddress((HANDLE)pHandle, zSymbol);
3462634582
#endif
3462734583
}
34628
-void winDlClose(sqlite3_vfs *pVfs, void *pHandle){
34584
+static void winDlClose(sqlite3_vfs *pVfs, void *pHandle){
3462934585
UNUSED_PARAMETER(pVfs);
3463034586
FreeLibrary((HANDLE)pHandle);
3463134587
}
3463234588
#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
3463334589
#define winDlOpen 0
@@ -34697,11 +34653,12 @@
3469734653
** the current time and date as a Julian Day number times 86_400_000. In
3469834654
** other words, write into *piNow the number of milliseconds since the Julian
3469934655
** epoch of noon in Greenwich on November 24, 4714 B.C according to the
3470034656
** proleptic Gregorian calendar.
3470134657
**
34702
-** On success, return 0. Return 1 if the time and date cannot be found.
34658
+** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date
34659
+** cannot be found.
3470334660
*/
3470434661
static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){
3470534662
/* FILETIME structure is a 64-bit value representing the number of
3470634663
100-nanosecond intervals since January 1, 1601 (= JD 2305813.5).
3470734664
*/
@@ -34717,11 +34674,11 @@
3471734674
#if SQLITE_OS_WINCE
3471834675
SYSTEMTIME time;
3471934676
GetSystemTime(&time);
3472034677
/* if SystemTimeToFileTime() fails, it returns zero. */
3472134678
if (!SystemTimeToFileTime(&time,&ft)){
34722
- return 1;
34679
+ return SQLITE_ERROR;
3472334680
}
3472434681
#else
3472534682
GetSystemTimeAsFileTime( &ft );
3472634683
#endif
3472734684
@@ -34733,19 +34690,19 @@
3473334690
if( sqlite3_current_time ){
3473434691
*piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
3473534692
}
3473634693
#endif
3473734694
UNUSED_PARAMETER(pVfs);
34738
- return 0;
34695
+ return SQLITE_OK;
3473934696
}
3474034697
3474134698
/*
3474234699
** Find the current time (in Universal Coordinated Time). Write the
3474334700
** current time and date as a Julian Day number into *prNow and
3474434701
** return 0. Return 1 if the time and date cannot be found.
3474534702
*/
34746
-int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){
34703
+static int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){
3474734704
int rc;
3474834705
sqlite3_int64 i;
3474934706
rc = winCurrentTimeInt64(pVfs, &i);
3475034707
if( !rc ){
3475134708
*prNow = i/86400000.0;
@@ -40068,11 +40025,10 @@
4006840025
needPagerReset = 0;
4006940026
}
4007040027
rc = pager_playback_one_page(pPager,&pPager->journalOff,0,1,0);
4007140028
if( rc!=SQLITE_OK ){
4007240029
if( rc==SQLITE_DONE ){
40073
- rc = SQLITE_OK;
4007440030
pPager->journalOff = szJ;
4007540031
break;
4007640032
}else if( rc==SQLITE_IOERR_SHORT_READ ){
4007740033
/* If the journal has been truncated, simply stop reading and
4007840034
** processing the journal. This might happen if the journal was
@@ -40330,10 +40286,11 @@
4033040286
#if defined(SQLITE_DEBUG) || defined(SQLITE_CHECK_PAGES)
4033140287
PgHdr *p; /* For looping over pages */
4033240288
#endif
4033340289
4033440290
assert( pPager->pWal );
40291
+ assert( pList );
4033540292
#ifdef SQLITE_DEBUG
4033640293
/* Verify that the page list is in accending order */
4033740294
for(p=pList; p && p->pDirty; p=p->pDirty){
4033840295
assert( p->pgno < p->pDirty->pgno );
4033940296
}
@@ -46566,11 +46523,11 @@
4656646523
*/
4656746524
if( iRead ){
4656846525
int sz;
4656946526
i64 iOffset;
4657046527
sz = pWal->hdr.szPage;
46571
- sz = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16);
46528
+ sz = (sz&0xfe00) + ((sz&0x0001)<<16);
4657246529
testcase( sz<=32768 );
4657346530
testcase( sz>=65536 );
4657446531
iOffset = walFrameOffset(iRead, sz) + WAL_FRAME_HDRSIZE;
4657546532
*pInWal = 1;
4657646533
/* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */
@@ -49879,21 +49836,23 @@
4987949836
*/
4988049837
if( isMemdb==0 && isTempDb==0 ){
4988149838
if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){
4988249839
int nFullPathname = pVfs->mxPathname+1;
4988349840
char *zFullPathname = sqlite3Malloc(nFullPathname);
49884
- sqlite3_mutex *mutexShared;
49841
+ MUTEX_LOGIC( sqlite3_mutex *mutexShared; )
4988549842
p->sharable = 1;
4988649843
if( !zFullPathname ){
4988749844
sqlite3_free(p);
4988849845
return SQLITE_NOMEM;
4988949846
}
4989049847
sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname);
49848
+#if SQLITE_THREADSAFE
4989149849
mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN);
4989249850
sqlite3_mutex_enter(mutexOpen);
4989349851
mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
4989449852
sqlite3_mutex_enter(mutexShared);
49853
+#endif
4989549854
for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){
4989649855
assert( pBt->nRef>0 );
4989749856
if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager))
4989849857
&& sqlite3PagerVfs(pBt->pPager)==pVfs ){
4989949858
int iDb;
@@ -49995,13 +49954,13 @@
4999549954
4999649955
#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
4999749956
/* Add the new BtShared object to the linked list sharable BtShareds.
4999849957
*/
4999949958
if( p->sharable ){
50000
- sqlite3_mutex *mutexShared;
49959
+ MUTEX_LOGIC( sqlite3_mutex *mutexShared; )
5000149960
pBt->nRef = 1;
50002
- mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
49961
+ MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);)
5000349962
if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){
5000449963
pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST);
5000549964
if( pBt->mutex==0 ){
5000649965
rc = SQLITE_NOMEM;
5000749966
db->mallocFailed = 0;
@@ -50079,16 +50038,16 @@
5007950038
** true if the BtShared.nRef counter reaches zero and return
5008050039
** false if it is still positive.
5008150040
*/
5008250041
static int removeFromSharingList(BtShared *pBt){
5008350042
#ifndef SQLITE_OMIT_SHARED_CACHE
50084
- sqlite3_mutex *pMaster;
50043
+ MUTEX_LOGIC( sqlite3_mutex *pMaster; )
5008550044
BtShared *pList;
5008650045
int removed = 0;
5008750046
5008850047
assert( sqlite3_mutex_notheld(pBt->mutex) );
50089
- pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
50048
+ MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
5009050049
sqlite3_mutex_enter(pMaster);
5009150050
pBt->nRef--;
5009250051
if( pBt->nRef<=0 ){
5009350052
if( GLOBAL(BtShared*,sqlite3SharedCacheList)==pBt ){
5009450053
GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt->pNext;
@@ -52698,11 +52657,10 @@
5269852657
}
5269952658
}
5270052659
if( c==0 ){
5270152660
if( pPage->intKey && !pPage->leaf ){
5270252661
lwr = idx;
52703
- upr = lwr - 1;
5270452662
break;
5270552663
}else{
5270652664
*pRes = 0;
5270752665
rc = SQLITE_OK;
5270852666
goto moveto_finish;
@@ -52716,11 +52674,11 @@
5271652674
if( lwr>upr ){
5271752675
break;
5271852676
}
5271952677
pCur->aiIdx[pCur->iPage] = (u16)(idx = (lwr+upr)/2);
5272052678
}
52721
- assert( lwr==upr+1 );
52679
+ assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) );
5272252680
assert( pPage->isInit );
5272352681
if( pPage->leaf ){
5272452682
chldPg = 0;
5272552683
}else if( lwr>=pPage->nCell ){
5272652684
chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]);
@@ -52981,10 +52939,12 @@
5298152939
}
5298252940
if( rc ){
5298352941
pTrunk = 0;
5298452942
goto end_allocate_page;
5298552943
}
52944
+ assert( pTrunk!=0 );
52945
+ assert( pTrunk->aData!=0 );
5298652946
5298752947
k = get4byte(&pTrunk->aData[4]); /* # of leaves on this trunk page */
5298852948
if( k==0 && !searchList ){
5298952949
/* The trunk has no leaves and the list is not being searched.
5299052950
** So extract the trunk page itself and use it as the newly
@@ -54108,17 +54068,19 @@
5410854068
** This is safe because dropping a cell only overwrites the first
5410954069
** four bytes of it, and this function does not need the first
5411054070
** four bytes of the divider cell. So the pointer is safe to use
5411154071
** later on.
5411254072
**
54113
- ** Unless SQLite is compiled in secure-delete mode. In this case,
54073
+ ** But not if we are in secure-delete mode. In secure-delete mode,
5411454074
** the dropCell() routine will overwrite the entire cell with zeroes.
5411554075
** In this case, temporarily copy the cell into the aOvflSpace[]
5411654076
** buffer. It will be copied out again as soon as the aSpace[] buffer
5411754077
** is allocated. */
5411854078
if( pBt->secureDelete ){
54119
- int iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData);
54079
+ int iOff;
54080
+
54081
+ iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData);
5412054082
if( (iOff+szNew[i])>(int)pBt->usableSize ){
5412154083
rc = SQLITE_CORRUPT_BKPT;
5412254084
memset(apOld, 0, (i+1)*sizeof(MemPage*));
5412354085
goto balance_cleanup;
5412454086
}else{
@@ -54534,10 +54496,11 @@
5453454496
int isDivider = 0;
5453554497
while( i==iNextOld ){
5453654498
/* Cell i is the cell immediately following the last cell on old
5453754499
** sibling page j. If the siblings are not leaf pages of an
5453854500
** intkey b-tree, then cell i was a divider cell. */
54501
+ assert( j+1 < ArraySize(apCopy) );
5453954502
pOld = apCopy[++j];
5454054503
iNextOld = i + !leafData + pOld->nCell + pOld->nOverflow;
5454154504
if( pOld->nOverflow ){
5454254505
nOverflow = pOld->nOverflow;
5454354506
iOverflow = i + !leafData + pOld->aOvfl[0].idx;
@@ -56876,18 +56839,18 @@
5687656839
/*
5687756840
** Release all resources associated with an sqlite3_backup* handle.
5687856841
*/
5687956842
SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){
5688056843
sqlite3_backup **pp; /* Ptr to head of pagers backup list */
56881
- sqlite3_mutex *mutex; /* Mutex to protect source database */
56844
+ MUTEX_LOGIC( sqlite3_mutex *mutex; ) /* Mutex to protect source database */
5688256845
int rc; /* Value to return */
5688356846
5688456847
/* Enter the mutexes */
5688556848
if( p==0 ) return SQLITE_OK;
5688656849
sqlite3_mutex_enter(p->pSrcDb->mutex);
5688756850
sqlite3BtreeEnter(p->pSrc);
56888
- mutex = p->pSrcDb->mutex;
56851
+ MUTEX_LOGIC( mutex = p->pSrcDb->mutex; )
5688956852
if( p->pDestDb ){
5689056853
sqlite3_mutex_enter(p->pDestDb->mutex);
5689156854
}
5689256855
5689356856
/* Detach this backup from the source pager. */
@@ -58983,34 +58946,33 @@
5898358946
** Change the comment on the the most recently coded instruction. Or
5898458947
** insert a No-op and add the comment to that new instruction. This
5898558948
** makes the code easier to read during debugging. None of this happens
5898658949
** in a production build.
5898758950
*/
58988
-SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){
58989
- va_list ap;
58990
- if( !p ) return;
58951
+static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){
5899158952
assert( p->nOp>0 || p->aOp==0 );
5899258953
assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed );
5899358954
if( p->nOp ){
58994
- char **pz = &p->aOp[p->nOp-1].zComment;
58955
+ assert( p->aOp );
58956
+ sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment);
58957
+ p->aOp[p->nOp-1].zComment = sqlite3VMPrintf(p->db, zFormat, ap);
58958
+ }
58959
+}
58960
+SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){
58961
+ va_list ap;
58962
+ if( p ){
5899558963
va_start(ap, zFormat);
58996
- sqlite3DbFree(p->db, *pz);
58997
- *pz = sqlite3VMPrintf(p->db, zFormat, ap);
58964
+ vdbeVComment(p, zFormat, ap);
5899858965
va_end(ap);
5899958966
}
5900058967
}
5900158968
SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){
5900258969
va_list ap;
59003
- if( !p ) return;
59004
- sqlite3VdbeAddOp0(p, OP_Noop);
59005
- assert( p->nOp>0 || p->aOp==0 );
59006
- assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed );
59007
- if( p->nOp ){
59008
- char **pz = &p->aOp[p->nOp-1].zComment;
58970
+ if( p ){
58971
+ sqlite3VdbeAddOp0(p, OP_Noop);
5900958972
va_start(ap, zFormat);
59010
- sqlite3DbFree(p->db, *pz);
59011
- *pz = sqlite3VMPrintf(p->db, zFormat, ap);
58973
+ vdbeVComment(p, zFormat, ap);
5901258974
va_end(ap);
5901358975
}
5901458976
}
5901558977
#endif /* NDEBUG */
5901658978
@@ -61266,11 +61228,11 @@
6126661228
** than 2GiB are support - anything large must be database corruption.
6126761229
** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so
6126861230
** this code can safely assume that nCellKey is 32-bits
6126961231
*/
6127061232
assert( sqlite3BtreeCursorIsValid(pCur) );
61271
- rc = sqlite3BtreeKeySize(pCur, &nCellKey);
61233
+ VVA_ONLY(rc =) sqlite3BtreeKeySize(pCur, &nCellKey);
6127261234
assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
6127361235
assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey );
6127461236
6127561237
/* Read in the complete content of the index entry */
6127661238
memset(&m, 0, sizeof(m));
@@ -61341,11 +61303,11 @@
6134161303
int rc;
6134261304
BtCursor *pCur = pC->pCursor;
6134361305
Mem m;
6134461306
6134561307
assert( sqlite3BtreeCursorIsValid(pCur) );
61346
- rc = sqlite3BtreeKeySize(pCur, &nCellKey);
61308
+ VVA_ONLY(rc =) sqlite3BtreeKeySize(pCur, &nCellKey);
6134761309
assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
6134861310
/* nCellKey will always be between 0 and 0xffffffff because of the say
6134961311
** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */
6135061312
if( nCellKey<=0 || nCellKey>0x7fffffff ){
6135161313
*res = 0;
@@ -65617,20 +65579,20 @@
6561765579
}else if( u.am.pC->cacheStatus==p->cacheCtr ){
6561865580
u.am.payloadSize = u.am.pC->payloadSize;
6561965581
u.am.zRec = (char*)u.am.pC->aRow;
6562065582
}else if( u.am.pC->isIndex ){
6562165583
assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) );
65622
- rc = sqlite3BtreeKeySize(u.am.pCrsr, &u.am.payloadSize64);
65584
+ VVA_ONLY(rc =) sqlite3BtreeKeySize(u.am.pCrsr, &u.am.payloadSize64);
6562365585
assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
6562465586
/* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the
6562565587
** payload size, so it is impossible for u.am.payloadSize64 to be
6562665588
** larger than 32 bits. */
6562765589
assert( (u.am.payloadSize64 & SQLITE_MAX_U32)==(u64)u.am.payloadSize64 );
6562865590
u.am.payloadSize = (u32)u.am.payloadSize64;
6562965591
}else{
6563065592
assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) );
65631
- rc = sqlite3BtreeDataSize(u.am.pCrsr, &u.am.payloadSize);
65593
+ VVA_ONLY(rc =) sqlite3BtreeDataSize(u.am.pCrsr, &u.am.payloadSize);
6563265594
assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
6563365595
}
6563465596
}else if( ALWAYS(u.am.pC->pseudoTableReg>0) ){
6563565597
u.am.pReg = &aMem[u.am.pC->pseudoTableReg];
6563665598
assert( u.am.pReg->flags & MEM_Blob );
@@ -67678,18 +67640,18 @@
6767867640
rc = sqlite3VdbeCursorMoveto(u.bk.pC);
6767967641
if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
6768067642
6768167643
if( u.bk.pC->isIndex ){
6768267644
assert( !u.bk.pC->isTable );
67683
- rc = sqlite3BtreeKeySize(u.bk.pCrsr, &u.bk.n64);
67645
+ VVA_ONLY(rc =) sqlite3BtreeKeySize(u.bk.pCrsr, &u.bk.n64);
6768467646
assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
6768567647
if( u.bk.n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){
6768667648
goto too_big;
6768767649
}
6768867650
u.bk.n = (u32)u.bk.n64;
6768967651
}else{
67690
- rc = sqlite3BtreeDataSize(u.bk.pCrsr, &u.bk.n);
67652
+ VVA_ONLY(rc =) sqlite3BtreeDataSize(u.bk.pCrsr, &u.bk.n);
6769167653
assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
6769267654
if( u.bk.n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
6769367655
goto too_big;
6769467656
}
6769567657
}
@@ -73322,11 +73284,12 @@
7332273284
pNew->flags |= EP_IntValue;
7332373285
pNew->u.iValue = iValue;
7332473286
}else{
7332573287
int c;
7332673288
pNew->u.zToken = (char*)&pNew[1];
73327
- memcpy(pNew->u.zToken, pToken->z, pToken->n);
73289
+ assert( pToken->z!=0 || pToken->n==0 );
73290
+ if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n);
7332873291
pNew->u.zToken[pToken->n] = 0;
7332973292
if( dequote && nExtra>=3
7333073293
&& ((c = pToken->z[0])=='\'' || c=='"' || c=='[' || c=='`') ){
7333173294
sqlite3Dequote(pNew->u.zToken);
7333273295
if( c=='"' ) pNew->flags |= EP_DblQuoted;
@@ -74361,15 +74324,23 @@
7436174324
** ephemeral table.
7436274325
*/
7436374326
p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0);
7436474327
if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){
7436574328
sqlite3 *db = pParse->db; /* Database connection */
74366
- Expr *pExpr = p->pEList->a[0].pExpr; /* Expression <column> */
74367
- int iCol = pExpr->iColumn; /* Index of column <column> */
7436874329
Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */
74369
- Table *pTab = p->pSrc->a[0].pTab; /* Table <table>. */
74330
+ Table *pTab; /* Table <table>. */
74331
+ Expr *pExpr; /* Expression <column> */
74332
+ int iCol; /* Index of column <column> */
7437074333
int iDb; /* Database idx for pTab */
74334
+
74335
+ assert( p ); /* Because of isCandidateForInOpt(p) */
74336
+ assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */
74337
+ assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */
74338
+ assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */
74339
+ pTab = p->pSrc->a[0].pTab;
74340
+ pExpr = p->pEList->a[0].pExpr;
74341
+ iCol = pExpr->iColumn;
7437174342
7437274343
/* Code an OP_VerifyCookie and OP_TableLock for <table>. */
7437374344
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
7437474345
sqlite3CodeVerifySchema(pParse, iDb);
7437574346
sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
@@ -76372,11 +76343,11 @@
7637276343
if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){
7637376344
return 2;
7637476345
}
7637576346
}else if( pA->op!=TK_COLUMN && pA->u.zToken ){
7637676347
if( ExprHasProperty(pB, EP_IntValue) || NEVER(pB->u.zToken==0) ) return 2;
76377
- if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ){
76348
+ if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){
7637876349
return 2;
7637976350
}
7638076351
}
7638176352
if( (pA->flags & EP_ExpCollate)!=(pB->flags & EP_ExpCollate) ) return 1;
7638276353
if( (pA->flags & EP_ExpCollate)!=0 && pA->pColl!=pB->pColl ) return 2;
@@ -81778,17 +81749,19 @@
8177881749
*/
8177981750
static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
8178081751
Table *pTab = pIndex->pTable; /* The table that is indexed */
8178181752
int iTab = pParse->nTab++; /* Btree cursor used for pTab */
8178281753
int iIdx = pParse->nTab++; /* Btree cursor used for pIndex */
81783
- int iSorter = iTab; /* Cursor opened by OpenSorter (if in use) */
81754
+ int iSorter; /* Cursor opened by OpenSorter (if in use) */
8178481755
int addr1; /* Address of top of loop */
8178581756
int addr2; /* Address to jump to for next iteration */
8178681757
int tnum; /* Root page of index */
8178781758
Vdbe *v; /* Generate code into this virtual machine */
8178881759
KeyInfo *pKey; /* KeyInfo for index */
81760
+#ifdef SQLITE_OMIT_MERGE_SORT
8178981761
int regIdxKey; /* Registers containing the index key */
81762
+#endif
8179081763
int regRecord; /* Register holding assemblied index record */
8179181764
sqlite3 *db = pParse->db; /* The database connection */
8179281765
int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
8179381766
8179481767
#ifndef SQLITE_OMIT_AUTHORIZATION
@@ -81818,21 +81791,22 @@
8181881791
8181981792
#ifndef SQLITE_OMIT_MERGE_SORT
8182081793
/* Open the sorter cursor if we are to use one. */
8182181794
iSorter = pParse->nTab++;
8182281795
sqlite3VdbeAddOp4(v, OP_SorterOpen, iSorter, 0, 0, (char*)pKey, P4_KEYINFO);
81796
+#else
81797
+ iSorter = iTab;
8182381798
#endif
8182481799
8182581800
/* Open the table. Loop through all rows of the table, inserting index
8182681801
** records into the sorter. */
8182781802
sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
8182881803
addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0);
81829
- addr2 = addr1 + 1;
8183081804
regRecord = sqlite3GetTempReg(pParse);
81831
- regIdxKey = sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
8183281805
8183381806
#ifndef SQLITE_OMIT_MERGE_SORT
81807
+ sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
8183481808
sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord);
8183581809
sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1);
8183681810
sqlite3VdbeJumpHere(v, addr1);
8183781811
addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0);
8183881812
if( pIndex->onError!=OE_None ){
@@ -81848,10 +81822,12 @@
8184881822
}
8184981823
sqlite3VdbeAddOp2(v, OP_SorterData, iSorter, regRecord);
8185081824
sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 1);
8185181825
sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
8185281826
#else
81827
+ regIdxKey = sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
81828
+ addr2 = addr1 + 1;
8185381829
if( pIndex->onError!=OE_None ){
8185481830
const int regRowid = regIdxKey + pIndex->nColumn;
8185581831
const int j2 = sqlite3VdbeCurrentAddr(v) + 2;
8185681832
void * const pRegKey = SQLITE_INT_TO_PTR(regIdxKey);
8185781833
@@ -81945,10 +81921,11 @@
8194581921
** before looking up the table.
8194681922
*/
8194781923
assert( pName1 && pName2 );
8194881924
iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
8194981925
if( iDb<0 ) goto exit_create_index;
81926
+ assert( pName && pName->z );
8195081927
8195181928
#ifndef SQLITE_OMIT_TEMPDB
8195281929
/* If the index name was unqualified, check if the the table
8195381930
** is a temp table. If so, set the database to 1. Do not do this
8195481931
** if initialising a database schema.
@@ -81972,10 +81949,11 @@
8197281949
pTblName->a[0].zDatabase);
8197381950
if( !pTab || db->mallocFailed ) goto exit_create_index;
8197481951
assert( db->aDb[iDb].pSchema==pTab->pSchema );
8197581952
}else{
8197681953
assert( pName==0 );
81954
+ assert( pStart==0 );
8197781955
pTab = pParse->pNewTable;
8197881956
if( !pTab ) goto exit_create_index;
8197981957
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
8198081958
}
8198181959
pDb = &db->aDb[iDb];
@@ -82014,10 +81992,11 @@
8201481992
** own name.
8201581993
*/
8201681994
if( pName ){
8201781995
zName = sqlite3NameFromToken(db, pName);
8201881996
if( zName==0 ) goto exit_create_index;
81997
+ assert( pName->z!=0 );
8201981998
if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
8202081999
goto exit_create_index;
8202182000
}
8202282001
if( !db->init.busy ){
8202382002
if( sqlite3FindTable(db, zName, 0)!=0 ){
@@ -82869,17 +82848,14 @@
8286982848
8287082849
/*
8287182850
** Commit a transaction
8287282851
*/
8287382852
SQLITE_PRIVATE void sqlite3CommitTransaction(Parse *pParse){
82874
- sqlite3 *db;
8287582853
Vdbe *v;
8287682854
8287782855
assert( pParse!=0 );
82878
- db = pParse->db;
82879
- assert( db!=0 );
82880
-/* if( db->aDb[0].pBt==0 ) return; */
82856
+ assert( pParse->db!=0 );
8288182857
if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ){
8288282858
return;
8288382859
}
8288482860
v = sqlite3GetVdbe(pParse);
8288582861
if( v ){
@@ -82889,17 +82865,14 @@
8288982865
8289082866
/*
8289182867
** Rollback a transaction
8289282868
*/
8289382869
SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse *pParse){
82894
- sqlite3 *db;
8289582870
Vdbe *v;
8289682871
8289782872
assert( pParse!=0 );
82898
- db = pParse->db;
82899
- assert( db!=0 );
82900
-/* if( db->aDb[0].pBt==0 ) return; */
82873
+ assert( pParse->db!=0 );
8290182874
if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ){
8290282875
return;
8290382876
}
8290482877
v = sqlite3GetVdbe(pParse);
8290582878
if( v ){
@@ -84701,20 +84674,19 @@
8470184674
/* Verify that the call to _bytes() does not invalidate the _text() pointer */
8470284675
assert( z2==(char*)sqlite3_value_text(argv[0]) );
8470384676
if( z2 ){
8470484677
z1 = contextMalloc(context, ((i64)n)+1);
8470584678
if( z1 ){
84706
- memcpy(z1, z2, n+1);
84707
- for(i=0; z1[i]; i++){
84708
- z1[i] = (char)sqlite3Toupper(z1[i]);
84679
+ for(i=0; i<n; i++){
84680
+ z1[i] = (char)sqlite3Toupper(z2[i]);
8470984681
}
84710
- sqlite3_result_text(context, z1, -1, sqlite3_free);
84682
+ sqlite3_result_text(context, z1, n, sqlite3_free);
8471184683
}
8471284684
}
8471384685
}
8471484686
static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
84715
- u8 *z1;
84687
+ char *z1;
8471684688
const char *z2;
8471784689
int i, n;
8471884690
UNUSED_PARAMETER(argc);
8471984691
z2 = (char*)sqlite3_value_text(argv[0]);
8472084692
n = sqlite3_value_bytes(argv[0]);
@@ -84721,15 +84693,14 @@
8472184693
/* Verify that the call to _bytes() does not invalidate the _text() pointer */
8472284694
assert( z2==(char*)sqlite3_value_text(argv[0]) );
8472384695
if( z2 ){
8472484696
z1 = contextMalloc(context, ((i64)n)+1);
8472584697
if( z1 ){
84726
- memcpy(z1, z2, n+1);
84727
- for(i=0; z1[i]; i++){
84728
- z1[i] = sqlite3Tolower(z1[i]);
84698
+ for(i=0; i<n; i++){
84699
+ z1[i] = sqlite3Tolower(z2[i]);
8472984700
}
84730
- sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
84701
+ sqlite3_result_text(context, z1, n, sqlite3_free);
8473184702
}
8473284703
}
8473384704
}
8473484705
8473584706
@@ -87102,10 +87073,11 @@
8710287073
sqlite3SelectDelete(db, pSelect);
8710387074
if( db->mallocFailed==1 ){
8710487075
fkTriggerDelete(db, pTrigger);
8710587076
return 0;
8710687077
}
87078
+ assert( pStep!=0 );
8710787079
8710887080
switch( action ){
8710987081
case OE_Restrict:
8711087082
pStep->op = TK_SELECT;
8711187083
break;
@@ -90025,11 +89997,11 @@
9002589997
sqlite3_vfs *pVfs = db->pVfs;
9002689998
void *handle;
9002789999
int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
9002890000
char *zErrmsg = 0;
9002990001
void **aHandle;
90030
- const int nMsg = 300;
90002
+ int nMsg = 300 + sqlite3Strlen30(zFile);
9003190003
9003290004
if( pzErrMsg ) *pzErrMsg = 0;
9003390005
9003490006
/* Ticket #1863. To avoid a creating security problems for older
9003590007
** applications that relink against newer versions of SQLite, the
@@ -90062,10 +90034,11 @@
9006290034
}
9006390035
xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*))
9006490036
sqlite3OsDlSym(pVfs, handle, zProc);
9006590037
if( xInit==0 ){
9006690038
if( pzErrMsg ){
90039
+ nMsg += sqlite3Strlen30(zProc);
9006790040
*pzErrMsg = zErrmsg = sqlite3_malloc(nMsg);
9006890041
if( zErrmsg ){
9006990042
sqlite3_snprintf(nMsg, zErrmsg,
9007090043
"no entry point [%s] in shared library [%s]", zProc,zFile);
9007190044
sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
@@ -90747,11 +90720,11 @@
9074790720
){
9074890721
int iReg;
9074990722
if( sqlite3ReadSchema(pParse) ) goto pragma_out;
9075090723
sqlite3CodeVerifySchema(pParse, iDb);
9075190724
iReg = ++pParse->nMem;
90752
- if( zLeft[0]=='p' ){
90725
+ if( sqlite3Tolower(zLeft[0])=='p' ){
9075390726
sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg);
9075490727
}else{
9075590728
sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, sqlite3Atoi(zRight));
9075690729
}
9075790730
sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1);
@@ -91360,11 +91333,11 @@
9136091333
{ OP_IfNeg, 1, 0, 0}, /* 1 */
9136191334
{ OP_String8, 0, 3, 0}, /* 2 */
9136291335
{ OP_ResultRow, 3, 1, 0},
9136391336
};
9136491337
91365
- int isQuick = (zLeft[0]=='q');
91338
+ int isQuick = (sqlite3Tolower(zLeft[0])=='q');
9136691339
9136791340
/* Initialize the VDBE program */
9136891341
if( sqlite3ReadSchema(pParse) ) goto pragma_out;
9136991342
pParse->nMem = 6;
9137091343
sqlite3VdbeSetNumCols(v, 1);
@@ -93942,11 +93915,14 @@
9394293915
/* If the column contains an "AS <name>" phrase, use <name> as the name */
9394393916
zName = sqlite3DbStrDup(db, zName);
9394493917
}else{
9394593918
Expr *pColExpr = p; /* The expression that is the result column name */
9394693919
Table *pTab; /* Table associated with this expression */
93947
- while( pColExpr->op==TK_DOT ) pColExpr = pColExpr->pRight;
93920
+ while( pColExpr->op==TK_DOT ){
93921
+ pColExpr = pColExpr->pRight;
93922
+ assert( pColExpr!=0 );
93923
+ }
9394893924
if( pColExpr->op==TK_COLUMN && ALWAYS(pColExpr->pTab!=0) ){
9394993925
/* For columns use the column name name */
9395093926
int iCol = pColExpr->iColumn;
9395193927
pTab = pColExpr->pTab;
9395293928
if( iCol<0 ) iCol = pTab->iPKey;
@@ -98940,10 +98916,11 @@
9894098916
break;
9894198917
}
9894298918
}
9894398919
}
9894498920
for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
98921
+ assert( aRegIdx );
9894598922
if( openAll || aRegIdx[i]>0 ){
9894698923
KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx);
9894798924
sqlite3VdbeAddOp4(v, OP_OpenWrite, iCur+i+1, pIdx->tnum, iDb,
9894898925
(char*)pKey, P4_KEYINFO_HANDOFF);
9894998926
assert( pParse->nTab>iCur+i+1 );
@@ -99113,10 +99090,11 @@
9911399090
sqlite3VdbeAddOp2(v, OP_Goto, 0, addr);
9911499091
sqlite3VdbeJumpHere(v, addr);
9911599092
9911699093
/* Close all tables */
9911799094
for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
99095
+ assert( aRegIdx );
9911899096
if( openAll || aRegIdx[i]>0 ){
9911999097
sqlite3VdbeAddOp2(v, OP_Close, iCur+i+1, 0);
9912099098
}
9912199099
}
9912299100
sqlite3VdbeAddOp2(v, OP_Close, iCur, 0);
@@ -103144,11 +103122,10 @@
103144103122
assert( roundUp==0 || roundUp==1 );
103145103123
assert( pIdx->nSample>0 );
103146103124
if( pVal==0 ) return SQLITE_ERROR;
103147103125
n = pIdx->aiRowEst[0];
103148103126
aSample = pIdx->aSample;
103149
- i = 0;
103150103127
eType = sqlite3_value_type(pVal);
103151103128
103152103129
if( eType==SQLITE_INTEGER ){
103153103130
v = sqlite3_value_int64(pVal);
103154103131
r = (i64)v;
@@ -105564,11 +105541,12 @@
105564105541
assert( bestJ>=0 );
105565105542
assert( notReady & getMask(pMaskSet, pTabList->a[bestJ].iCursor) );
105566105543
WHERETRACE(("*** Optimizer selects table %d for loop %d"
105567105544
" with cost=%g and nRow=%g\n",
105568105545
bestJ, pLevel-pWInfo->a, bestPlan.rCost, bestPlan.plan.nRow));
105569
- if( (bestPlan.plan.wsFlags & WHERE_ORDERBY)!=0 ){
105546
+ /* The ALWAYS() that follows was added to hush up clang scan-build */
105547
+ if( (bestPlan.plan.wsFlags & WHERE_ORDERBY)!=0 && ALWAYS(ppOrderBy) ){
105570105548
*ppOrderBy = 0;
105571105549
}
105572105550
if( (bestPlan.plan.wsFlags & WHERE_DISTINCT)!=0 ){
105573105551
assert( pWInfo->eDistinct==0 );
105574105552
pWInfo->eDistinct = WHERE_DISTINCT_ORDERED;
@@ -109180,11 +109158,13 @@
109180109158
sqlite3ParserTOKENTYPE yyminor /* The value for the token */
109181109159
sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */
109182109160
){
109183109161
YYMINORTYPE yyminorunion;
109184109162
int yyact; /* The parser action. */
109163
+#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
109185109164
int yyendofinput; /* True if we are at the end of input */
109165
+#endif
109186109166
#ifdef YYERRORSYMBOL
109187109167
int yyerrorhit = 0; /* True if yymajor has invoked an error */
109188109168
#endif
109189109169
yyParser *yypParser; /* The parser */
109190109170
@@ -109203,11 +109183,13 @@
109203109183
yypParser->yyerrcnt = -1;
109204109184
yypParser->yystack[0].stateno = 0;
109205109185
yypParser->yystack[0].major = 0;
109206109186
}
109207109187
yyminorunion.yy0 = yyminor;
109188
+#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
109208109189
yyendofinput = (yymajor==0);
109190
+#endif
109209109191
sqlite3ParserARG_STORE;
109210109192
109211109193
#ifndef NDEBUG
109212109194
if( yyTraceFILE ){
109213109195
fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]);
@@ -109215,11 +109197,10 @@
109215109197
#endif
109216109198
109217109199
do{
109218109200
yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
109219109201
if( yyact<YYNSTATE ){
109220
- assert( !yyendofinput ); /* Impossible to shift the $ token */
109221109202
yy_shift(yypParser,yyact,yymajor,&yyminorunion);
109222109203
yypParser->yyerrcnt--;
109223109204
yymajor = YYNOCODE;
109224109205
}else if( yyact < YYNSTATE + YYNRULE ){
109225109206
yy_reduce(yypParser,yyact-YYNSTATE);
@@ -110607,11 +110588,11 @@
110607110588
**
110608110589
** * Recursive calls to this routine from thread X return immediately
110609110590
** without blocking.
110610110591
*/
110611110592
SQLITE_API int sqlite3_initialize(void){
110612
- sqlite3_mutex *pMaster; /* The main static mutex */
110593
+ MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */
110613110594
int rc; /* Result code */
110614110595
110615110596
#ifdef SQLITE_OMIT_WSD
110616110597
rc = sqlite3_wsd_init(4096, 24);
110617110598
if( rc!=SQLITE_OK ){
@@ -110641,11 +110622,11 @@
110641110622
** This operation is protected by the STATIC_MASTER mutex. Note that
110642110623
** MutexAlloc() is called for a static mutex prior to initializing the
110643110624
** malloc subsystem - this implies that the allocation of a static
110644110625
** mutex must not require support from the malloc subsystem.
110645110626
*/
110646
- pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
110627
+ MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
110647110628
sqlite3_mutex_enter(pMaster);
110648110629
sqlite3GlobalConfig.isMutexInit = 1;
110649110630
if( !sqlite3GlobalConfig.isMallocInit ){
110650110631
rc = sqlite3MallocInit();
110651110632
}
@@ -111715,17 +111696,17 @@
111715111696
sqlite3 *db,
111716111697
const char *zName,
111717111698
int nArg
111718111699
){
111719111700
int nName = sqlite3Strlen30(zName);
111720
- int rc;
111701
+ int rc = SQLITE_OK;
111721111702
sqlite3_mutex_enter(db->mutex);
111722111703
if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){
111723
- sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
111724
- 0, sqlite3InvalidFunction, 0, 0, 0);
111704
+ rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
111705
+ 0, sqlite3InvalidFunction, 0, 0, 0);
111725111706
}
111726
- rc = sqlite3ApiExit(db, SQLITE_OK);
111707
+ rc = sqlite3ApiExit(db, rc);
111727111708
sqlite3_mutex_leave(db->mutex);
111728111709
return rc;
111729111710
}
111730111711
111731111712
#ifndef SQLITE_OMIT_TRACE
@@ -112783,10 +112764,11 @@
112783112764
if( db ){
112784112765
assert( db->mutex!=0 || isThreadsafe==0 || sqlite3GlobalConfig.bFullMutex==0 );
112785112766
sqlite3_mutex_leave(db->mutex);
112786112767
}
112787112768
rc = sqlite3_errcode(db);
112769
+ assert( db!=0 || rc==SQLITE_NOMEM );
112788112770
if( rc==SQLITE_NOMEM ){
112789112771
sqlite3_close(db);
112790112772
db = 0;
112791112773
}else if( rc!=SQLITE_OK ){
112792112774
db->magic = SQLITE_MAGIC_SICK;
@@ -114511,10 +114493,17 @@
114511114493
#else
114512114494
# define TESTONLY(X)
114513114495
#endif
114514114496
114515114497
#endif /* SQLITE_AMALGAMATION */
114498
+
114499
+#ifdef SQLITE_DEBUG
114500
+SQLITE_PRIVATE int sqlite3Fts3Corrupt(void);
114501
+# define FTS_CORRUPT_VTAB sqlite3Fts3Corrupt()
114502
+#else
114503
+# define FTS_CORRUPT_VTAB SQLITE_CORRUPT_VTAB
114504
+#endif
114516114505
114517114506
typedef struct Fts3Table Fts3Table;
114518114507
typedef struct Fts3Cursor Fts3Cursor;
114519114508
typedef struct Fts3Expr Fts3Expr;
114520114509
typedef struct Fts3Phrase Fts3Phrase;
@@ -115012,11 +115001,11 @@
115012115001
char **pp,
115013115002
char *pStart,
115014115003
sqlite3_int64 *pVal
115015115004
){
115016115005
sqlite3_int64 iVal;
115017
- char *p = *pp;
115006
+ char *p;
115018115007
115019115008
/* Pointer p now points at the first byte past the varint we are
115020115009
** interested in. So, unless the doclist is corrupt, the 0x80 bit is
115021115010
** clear on character p[-1]. */
115022115011
for(p = (*pp)-2; p>=pStart && *p&0x80; p--);
@@ -115413,11 +115402,11 @@
115413115402
** the output value undefined. Otherwise SQLITE_OK is returned.
115414115403
**
115415115404
** This function is used when parsing the "prefix=" FTS4 parameter.
115416115405
*/
115417115406
static int fts3GobbleInt(const char **pp, int *pnOut){
115418
- const char *p = *pp; /* Iterator pointer */
115407
+ const char *p; /* Iterator pointer */
115419115408
int nInt = 0; /* Output value */
115420115409
115421115410
for(p=*pp; p[0]>='0' && p[0]<='9'; p++){
115422115411
nInt = nInt * 10 + (p[0] - '0');
115423115412
}
@@ -115912,11 +115901,11 @@
115912115901
if( rc==SQLITE_OK ){
115913115902
/* If no row was found and no error has occured, then the %_content
115914115903
** table is missing a row that is present in the full-text index.
115915115904
** The data structures are corrupt.
115916115905
*/
115917
- rc = SQLITE_CORRUPT_VTAB;
115906
+ rc = FTS_CORRUPT_VTAB;
115918115907
}
115919115908
pCsr->isEof = 1;
115920115909
if( pContext ){
115921115910
sqlite3_result_error_code(pContext, rc);
115922115911
}
@@ -115972,11 +115961,11 @@
115972115961
** nNode bytes of content (see sqlite3Fts3ReadBlock() for details).
115973115962
*/
115974115963
zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
115975115964
zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
115976115965
if( zCsr>zEnd ){
115977
- return SQLITE_CORRUPT_VTAB;
115966
+ return FTS_CORRUPT_VTAB;
115978115967
}
115979115968
115980115969
while( zCsr<zEnd && (piFirst || piLast) ){
115981115970
int cmp; /* memcmp() result */
115982115971
int nSuffix; /* Size of term suffix */
@@ -115990,11 +115979,11 @@
115990115979
}
115991115980
isFirstTerm = 0;
115992115981
zCsr += sqlite3Fts3GetVarint32(zCsr, &nSuffix);
115993115982
115994115983
if( nPrefix<0 || nSuffix<0 || &zCsr[nSuffix]>zEnd ){
115995
- rc = SQLITE_CORRUPT_VTAB;
115984
+ rc = FTS_CORRUPT_VTAB;
115996115985
goto finish_scan;
115997115986
}
115998115987
if( nPrefix+nSuffix>nAlloc ){
115999115988
char *zNew;
116000115989
nAlloc = (nPrefix+nSuffix) * 2;
@@ -116003,10 +115992,11 @@
116003115992
rc = SQLITE_NOMEM;
116004115993
goto finish_scan;
116005115994
}
116006115995
zBuffer = zNew;
116007115996
}
115997
+ assert( zBuffer );
116008115998
memcpy(&zBuffer[nPrefix], zCsr, nSuffix);
116009115999
nBuffer = nPrefix + nSuffix;
116010116000
zCsr += nSuffix;
116011116001
116012116002
/* Compare the term we are searching for with the term just loaded from
@@ -117439,11 +117429,11 @@
117439117429
** moves *ppPoslist so that it instead points to the first byte of the
117440117430
** same position list.
117441117431
*/
117442117432
static void fts3ReversePoslist(char *pStart, char **ppPoslist){
117443117433
char *p = &(*ppPoslist)[-2];
117444
- char c;
117434
+ char c = 0;
117445117435
117446117436
while( p>pStart && (c=*p--)==0 );
117447117437
while( p>pStart && (*p & 0x80) | c ){
117448117438
c = *p--;
117449117439
}
@@ -118433,11 +118423,11 @@
118433118423
while( a<pEnd ){
118434118424
a += sqlite3Fts3GetVarint(a, &nByte);
118435118425
}
118436118426
if( nDoc==0 || nByte==0 ){
118437118427
sqlite3_reset(pStmt);
118438
- return SQLITE_CORRUPT_VTAB;
118428
+ return FTS_CORRUPT_VTAB;
118439118429
}
118440118430
118441118431
pCsr->nDoc = nDoc;
118442118432
pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz);
118443118433
assert( pCsr->nRowAvg>0 );
@@ -118909,12 +118899,15 @@
118909118899
}
118910118900
118911118901
aPoslist = pExpr->pRight->pPhrase->doclist.pList;
118912118902
nToken = pExpr->pRight->pPhrase->nToken;
118913118903
for(p=pExpr->pLeft; p && res; p=p->pLeft){
118914
- int nNear = p->pParent->nNear;
118915
- Fts3Phrase *pPhrase = (
118904
+ int nNear;
118905
+ Fts3Phrase *pPhrase;
118906
+ assert( p->pParent && p->pParent->pLeft==p );
118907
+ nNear = p->pParent->nNear;
118908
+ pPhrase = (
118916118909
p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase
118917118910
);
118918118911
res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase);
118919118912
}
118920118913
}
@@ -119400,10 +119393,19 @@
119400119393
pPhrase->aToken[i].pSegcsr = 0;
119401119394
}
119402119395
}
119403119396
}
119404119397
119398
+/*
119399
+** Return SQLITE_CORRUPT_VTAB.
119400
+*/
119401
+#ifdef SQLITE_DEBUG
119402
+SQLITE_PRIVATE int sqlite3Fts3Corrupt(){
119403
+ return SQLITE_CORRUPT_VTAB;
119404
+}
119405
+#endif
119406
+
119405119407
#if !SQLITE_CORE
119406119408
/*
119407119409
** Initialize API pointer table, if required.
119408119410
*/
119409119411
SQLITE_API int sqlite3_extension_init(
@@ -120197,12 +120199,16 @@
120197120199
p->pPhrase = (Fts3Phrase *)&p[1];
120198120200
p->pPhrase->iColumn = pParse->iDefaultCol;
120199120201
p->pPhrase->nToken = nToken;
120200120202
120201120203
zBuf = (char *)&p->pPhrase->aToken[nToken];
120202
- memcpy(zBuf, zTemp, nTemp);
120203
- sqlite3_free(zTemp);
120204
+ if( zTemp ){
120205
+ memcpy(zBuf, zTemp, nTemp);
120206
+ sqlite3_free(zTemp);
120207
+ }else{
120208
+ assert( nTemp==0 );
120209
+ }
120204120210
120205120211
for(jj=0; jj<p->pPhrase->nToken; jj++){
120206120212
p->pPhrase->aToken[jj].z = zBuf;
120207120213
zBuf += p->pPhrase->aToken[jj].n;
120208120214
}
@@ -122957,11 +122963,11 @@
122957122963
sqlite3_bind_int64(pStmt, 1, iDocid);
122958122964
}
122959122965
rc = sqlite3_step(pStmt);
122960122966
if( rc!=SQLITE_ROW || sqlite3_column_type(pStmt, 0)!=SQLITE_BLOB ){
122961122967
rc = sqlite3_reset(pStmt);
122962
- if( rc==SQLITE_OK ) rc = SQLITE_CORRUPT_VTAB;
122968
+ if( rc==SQLITE_OK ) rc = FTS_CORRUPT_VTAB;
122963122969
pStmt = 0;
122964122970
}else{
122965122971
rc = SQLITE_OK;
122966122972
}
122967122973
}
@@ -123761,11 +123767,11 @@
123761123767
pNext += sqlite3Fts3GetVarint32(pNext, &nPrefix);
123762123768
pNext += sqlite3Fts3GetVarint32(pNext, &nSuffix);
123763123769
if( nPrefix<0 || nSuffix<=0
123764123770
|| &pNext[nSuffix]>&pReader->aNode[pReader->nNode]
123765123771
){
123766
- return SQLITE_CORRUPT_VTAB;
123772
+ return FTS_CORRUPT_VTAB;
123767123773
}
123768123774
123769123775
if( nPrefix+nSuffix>pReader->nTermAlloc ){
123770123776
int nNew = (nPrefix+nSuffix)*2;
123771123777
char *zNew = sqlite3_realloc(pReader->zTerm, nNew);
@@ -123791,11 +123797,11 @@
123791123797
** of these statements is untrue, then the data structure is corrupt.
123792123798
*/
123793123799
if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode]
123794123800
|| (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1])
123795123801
){
123796
- return SQLITE_CORRUPT_VTAB;
123802
+ return FTS_CORRUPT_VTAB;
123797123803
}
123798123804
return SQLITE_OK;
123799123805
}
123800123806
123801123807
/*
@@ -125745,11 +125751,10 @@
125745125751
sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */
125746125752
){
125747125753
Fts3Table *p = (Fts3Table *)pVtab;
125748125754
int rc = SQLITE_OK; /* Return Code */
125749125755
int isRemove = 0; /* True for an UPDATE or DELETE */
125750
- sqlite3_int64 iRemove = 0; /* Rowid removed by UPDATE or DELETE */
125751125756
u32 *aSzIns = 0; /* Sizes of inserted documents */
125752125757
u32 *aSzDel; /* Sizes of deleted documents */
125753125758
int nChng = 0; /* Net change in number of documents */
125754125759
int bInsertDone = 0;
125755125760
@@ -125828,23 +125833,23 @@
125828125833
/* If this is a DELETE or UPDATE operation, remove the old record. */
125829125834
if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
125830125835
assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER );
125831125836
rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel);
125832125837
isRemove = 1;
125833
- iRemove = sqlite3_value_int64(apVal[0]);
125834125838
}
125835125839
125836125840
/* If this is an INSERT or UPDATE operation, insert the new record. */
125837125841
if( nArg>1 && rc==SQLITE_OK ){
125838125842
if( bInsertDone==0 ){
125839125843
rc = fts3InsertData(p, apVal, pRowid);
125840
- if( rc==SQLITE_CONSTRAINT ) rc = SQLITE_CORRUPT_VTAB;
125844
+ if( rc==SQLITE_CONSTRAINT ) rc = FTS_CORRUPT_VTAB;
125841125845
}
125842
- if( rc==SQLITE_OK && (!isRemove || *pRowid!=iRemove) ){
125846
+ if( rc==SQLITE_OK && (!isRemove || *pRowid!=p->iPrevDocid ) ){
125843125847
rc = fts3PendingTermsDocid(p, *pRowid);
125844125848
}
125845125849
if( rc==SQLITE_OK ){
125850
+ assert( p->iPrevDocid==*pRowid );
125846125851
rc = fts3InsertTerms(p, apVal, aSzIns);
125847125852
}
125848125853
if( p->bHasDocsize ){
125849125854
fts3InsertDocsize(&rc, p, aSzIns);
125850125855
}
@@ -126734,11 +126739,11 @@
126734126739
pStmt = *ppStmt;
126735126740
assert( sqlite3_data_count(pStmt)==1 );
126736126741
126737126742
a = sqlite3_column_blob(pStmt, 0);
126738126743
a += sqlite3Fts3GetVarint(a, &nDoc);
126739
- if( nDoc==0 ) return SQLITE_CORRUPT_VTAB;
126744
+ if( nDoc==0 ) return FTS_CORRUPT_VTAB;
126740126745
*pnDoc = (u32)nDoc;
126741126746
126742126747
if( paLen ) *paLen = a;
126743126748
return SQLITE_OK;
126744126749
}
@@ -127313,11 +127318,11 @@
127313127318
sqlite3_snprintf(sizeof(aBuffer), aBuffer,
127314127319
"%d %d %d %d ", iCol, pTerm-sCtx.aTerm, iStart, iEnd-iStart
127315127320
);
127316127321
rc = fts3StringAppend(&res, aBuffer, -1);
127317127322
}else if( rc==SQLITE_DONE ){
127318
- rc = SQLITE_CORRUPT_VTAB;
127323
+ rc = FTS_CORRUPT_VTAB;
127319127324
}
127320127325
}
127321127326
}
127322127327
if( rc==SQLITE_DONE ){
127323127328
rc = SQLITE_OK;
@@ -128654,11 +128659,12 @@
128654128659
pCsr->nConstraint = argc;
128655128660
if( !pCsr->aConstraint ){
128656128661
rc = SQLITE_NOMEM;
128657128662
}else{
128658128663
memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*argc);
128659
- assert( (idxStr==0 && argc==0) || (int)strlen(idxStr)==argc*2 );
128664
+ assert( (idxStr==0 && argc==0)
128665
+ || (idxStr && (int)strlen(idxStr)==argc*2) );
128660128666
for(ii=0; ii<argc; ii++){
128661128667
RtreeConstraint *p = &pCsr->aConstraint[ii];
128662128668
p->op = idxStr[ii*2];
128663128669
p->iCoord = idxStr[ii*2+1]-'a';
128664128670
if( p->op==RTREE_MATCH ){
@@ -128955,11 +128961,14 @@
128955128961
int iCell;
128956128962
sqlite3_int64 iBest = 0;
128957128963
128958128964
float fMinGrowth = 0.0;
128959128965
float fMinArea = 0.0;
128966
+#if VARIANT_RSTARTREE_CHOOSESUBTREE
128960128967
float fMinOverlap = 0.0;
128968
+ float overlap;
128969
+#endif
128961128970
128962128971
int nCell = NCELL(pNode);
128963128972
RtreeCell cell;
128964128973
RtreeNode *pChild;
128965128974
@@ -128987,33 +128996,34 @@
128987128996
*/
128988128997
for(iCell=0; iCell<nCell; iCell++){
128989128998
int bBest = 0;
128990128999
float growth;
128991129000
float area;
128992
- float overlap = 0.0;
128993129001
nodeGetCell(pRtree, pNode, iCell, &cell);
128994129002
growth = cellGrowth(pRtree, &cell, pCell);
128995129003
area = cellArea(pRtree, &cell);
128996129004
128997129005
#if VARIANT_RSTARTREE_CHOOSESUBTREE
128998129006
if( ii==(pRtree->iDepth-1) ){
128999129007
overlap = cellOverlapEnlargement(pRtree,&cell,pCell,aCell,nCell,iCell);
129008
+ }else{
129009
+ overlap = 0.0;
129000129010
}
129001129011
if( (iCell==0)
129002129012
|| (overlap<fMinOverlap)
129003129013
|| (overlap==fMinOverlap && growth<fMinGrowth)
129004129014
|| (overlap==fMinOverlap && growth==fMinGrowth && area<fMinArea)
129005129015
){
129006129016
bBest = 1;
129017
+ fMinOverlap = overlap;
129007129018
}
129008129019
#else
129009129020
if( iCell==0||growth<fMinGrowth||(growth==fMinGrowth && area<fMinArea) ){
129010129021
bBest = 1;
129011129022
}
129012129023
#endif
129013129024
if( bBest ){
129014
- fMinOverlap = overlap;
129015129025
fMinGrowth = growth;
129016129026
fMinArea = area;
129017129027
iBest = cell.iRowid;
129018129028
}
129019129029
}
129020129030
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -656,11 +656,11 @@
656 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
657 ** [sqlite_version()] and [sqlite_source_id()].
658 */
659 #define SQLITE_VERSION "3.7.9"
660 #define SQLITE_VERSION_NUMBER 3007009
661 #define SQLITE_SOURCE_ID "2011-10-11 20:41:54 b94a80a832777f0e639f6a81fcfe169bf970a8c0"
662
663 /*
664 ** CAPI3REF: Run-Time Library Version Numbers
665 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
666 **
@@ -3351,11 +3351,12 @@
3351 ** zSql string ends at either the first '\000' or '\u0000' character or
3352 ** the nByte-th byte, whichever comes first. If the caller knows
3353 ** that the supplied string is nul-terminated, then there is a small
3354 ** performance advantage to be gained by passing an nByte parameter that
3355 ** is equal to the number of bytes in the input string <i>including</i>
3356 ** the nul-terminator bytes.
 
3357 **
3358 ** ^If pzTail is not NULL then *pzTail is made to point to the first byte
3359 ** past the end of the first SQL statement in zSql. These routines only
3360 ** compile the first statement in zSql, so *pzTail is left pointing to
3361 ** what remains uncompiled.
@@ -3572,10 +3573,17 @@
3572 ** ^(In those routines that have a fourth argument, its value is the
3573 ** number of bytes in the parameter. To be clear: the value is the
3574 ** number of <u>bytes</u> in the value, not the number of characters.)^
3575 ** ^If the fourth parameter is negative, the length of the string is
3576 ** the number of bytes up to the first zero terminator.
 
 
 
 
 
 
 
3577 **
3578 ** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
3579 ** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
3580 ** string after SQLite has finished with it. ^The destructor is called
3581 ** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(),
@@ -4590,11 +4598,16 @@
4590 ** is negative, then SQLite takes result text from the 2nd parameter
4591 ** through the first zero character.
4592 ** ^If the 3rd parameter to the sqlite3_result_text* interfaces
4593 ** is non-negative, then as many bytes (not characters) of the text
4594 ** pointed to by the 2nd parameter are taken as the application-defined
4595 ** function result.
 
 
 
 
 
4596 ** ^If the 4th parameter to the sqlite3_result_text* interfaces
4597 ** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that
4598 ** function as the destructor on the text or BLOB result when it has
4599 ** finished using that result.
4600 ** ^If the 4th parameter to the sqlite3_result_text* interfaces or to
@@ -9315,18 +9328,21 @@
9315 /*
9316 ** If this is a no-op implementation, implement everything as macros.
9317 */
9318 #define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8)
9319 #define sqlite3_mutex_free(X)
9320 #define sqlite3_mutex_enter(X)
9321 #define sqlite3_mutex_try(X) SQLITE_OK
9322 #define sqlite3_mutex_leave(X)
9323 #define sqlite3_mutex_held(X) ((void)(X),1)
9324 #define sqlite3_mutex_notheld(X) ((void)(X),1)
9325 #define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8)
9326 #define sqlite3MutexInit() SQLITE_OK
9327 #define sqlite3MutexEnd()
 
 
 
9328 #endif /* defined(SQLITE_MUTEX_OMIT) */
9329
9330 /************** End of mutex.h ***********************************************/
9331 /************** Continuing where we left off in sqliteInt.h ******************/
9332
@@ -11754,19 +11770,21 @@
11754 # define sqlite3VtabInSync(db) 0
11755 # define sqlite3VtabLock(X)
11756 # define sqlite3VtabUnlock(X)
11757 # define sqlite3VtabUnlockList(X)
11758 # define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK
 
11759 #else
11760 SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table*);
11761 SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, char **);
11762 SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db);
11763 SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db);
11764 SQLITE_PRIVATE void sqlite3VtabLock(VTable *);
11765 SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *);
11766 SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*);
11767 SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int);
 
11768 # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
11769 #endif
11770 SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*);
11771 SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*);
11772 SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*);
@@ -11782,11 +11800,10 @@
11782 SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
11783 SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*);
11784 SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
11785 SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
11786 SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*);
11787 SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*);
11788 SQLITE_PRIVATE const char *sqlite3JournalModename(int);
11789 SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int, int, int*, int*);
11790 SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int);
11791
11792 /* Declarations for functions in fkey.c. All of these are replaced by
@@ -13558,16 +13575,22 @@
13558 }
13559 return 0;
13560 }
13561
13562 /*
13563 ** Set the time to the current time reported by the VFS
 
 
13564 */
13565 static void setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
13566 sqlite3 *db = sqlite3_context_db_handle(context);
13567 sqlite3OsCurrentTimeInt64(db->pVfs, &p->iJD);
13568 p->validJD = 1;
 
 
 
 
13569 }
13570
13571 /*
13572 ** Attempt to parse the given string into a Julian Day Number. Return
13573 ** the number of errors.
@@ -13593,12 +13616,11 @@
13593 if( parseYyyyMmDd(zDate,p)==0 ){
13594 return 0;
13595 }else if( parseHhMmSs(zDate, p)==0 ){
13596 return 0;
13597 }else if( sqlite3StrICmp(zDate,"now")==0){
13598 setDateTimeToCurrent(context, p);
13599 return 0;
13600 }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){
13601 p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5);
13602 p->validJD = 1;
13603 return 0;
13604 }
@@ -14021,12 +14043,13 @@
14021 int i;
14022 const unsigned char *z;
14023 int eType;
14024 memset(p, 0, sizeof(*p));
14025 if( argc==0 ){
14026 setDateTimeToCurrent(context, p);
14027 }else if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
 
14028 || eType==SQLITE_INTEGER ){
14029 p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5);
14030 p->validJD = 1;
14031 }else{
14032 z = sqlite3_value_text(argv[0]);
@@ -14334,35 +14357,32 @@
14334 ){
14335 time_t t;
14336 char *zFormat = (char *)sqlite3_user_data(context);
14337 sqlite3 *db;
14338 sqlite3_int64 iT;
 
 
14339 char zBuf[20];
14340
14341 UNUSED_PARAMETER(argc);
14342 UNUSED_PARAMETER(argv);
14343
14344 db = sqlite3_context_db_handle(context);
14345 sqlite3OsCurrentTimeInt64(db->pVfs, &iT);
14346 t = iT/1000 - 10000*(sqlite3_int64)21086676;
14347 #ifdef HAVE_GMTIME_R
14348 {
14349 struct tm sNow;
14350 gmtime_r(&t, &sNow);
 
 
 
 
 
14351 strftime(zBuf, 20, zFormat, &sNow);
14352 }
14353 #else
14354 {
14355 struct tm *pTm;
14356 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14357 pTm = gmtime(&t);
14358 strftime(zBuf, 20, zFormat, pTm);
14359 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14360 }
14361 #endif
14362
14363 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
14364 }
14365 #endif
14366
14367 /*
14368 ** This function registered all of the above C functions as SQL
@@ -14693,16 +14713,16 @@
14693 ** Register a VFS with the system. It is harmless to register the same
14694 ** VFS multiple times. The new VFS becomes the default if makeDflt is
14695 ** true.
14696 */
14697 SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){
14698 sqlite3_mutex *mutex = 0;
14699 #ifndef SQLITE_OMIT_AUTOINIT
14700 int rc = sqlite3_initialize();
14701 if( rc ) return rc;
14702 #endif
14703 mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
14704 sqlite3_mutex_enter(mutex);
14705 vfsUnlink(pVfs);
14706 if( makeDflt || vfsList==0 ){
14707 pVfs->pNext = vfsList;
14708 vfsList = pVfs;
@@ -18946,52 +18966,14 @@
18946 ** an historical reference. Most of the "enhancements" have been backed
18947 ** out so that the functionality is now the same as standard printf().
18948 **
18949 **************************************************************************
18950 **
18951 ** The following modules is an enhanced replacement for the "printf" subroutines
18952 ** found in the standard C library. The following enhancements are
18953 ** supported:
18954 **
18955 ** + Additional functions. The standard set of "printf" functions
18956 ** includes printf, fprintf, sprintf, vprintf, vfprintf, and
18957 ** vsprintf. This module adds the following:
18958 **
18959 ** * snprintf -- Works like sprintf, but has an extra argument
18960 ** which is the size of the buffer written to.
18961 **
18962 ** * mprintf -- Similar to sprintf. Writes output to memory
18963 ** obtained from malloc.
18964 **
18965 ** * xprintf -- Calls a function to dispose of output.
18966 **
18967 ** * nprintf -- No output, but returns the number of characters
18968 ** that would have been output by printf.
18969 **
18970 ** * A v- version (ex: vsnprintf) of every function is also
18971 ** supplied.
18972 **
18973 ** + A few extensions to the formatting notation are supported:
18974 **
18975 ** * The "=" flag (similar to "-") causes the output to be
18976 ** be centered in the appropriately sized field.
18977 **
18978 ** * The %b field outputs an integer in binary notation.
18979 **
18980 ** * The %c field now accepts a precision. The character output
18981 ** is repeated by the number of times the precision specifies.
18982 **
18983 ** * The %' field works like %c, but takes as its character the
18984 ** next character of the format string, instead of the next
18985 ** argument. For example, printf("%.78'-") prints 78 minus
18986 ** signs, the same as printf("%.78c",'-').
18987 **
18988 ** + When compiled using GCC on a SPARC, this version of printf is
18989 ** faster than the library printf for SUN OS 4.1.
18990 **
18991 ** + All functions are fully reentrant.
18992 **
18993 */
18994
18995 /*
18996 ** Conversion types fall into various categories as defined by the
18997 ** following enumeration.
@@ -19125,43 +19107,19 @@
19125 }
19126 }
19127
19128 /*
19129 ** On machines with a small stack size, you can redefine the
19130 ** SQLITE_PRINT_BUF_SIZE to be less than 350.
19131 */
19132 #ifndef SQLITE_PRINT_BUF_SIZE
19133 # define SQLITE_PRINT_BUF_SIZE 70
19134 #endif
19135 #define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */
19136
19137 /*
19138 ** The root program. All variations call this core.
19139 **
19140 ** INPUTS:
19141 ** func This is a pointer to a function taking three arguments
19142 ** 1. A pointer to anything. Same as the "arg" parameter.
19143 ** 2. A pointer to the list of characters to be output
19144 ** (Note, this list is NOT null terminated.)
19145 ** 3. An integer number of characters to be output.
19146 ** (Note: This number might be zero.)
19147 **
19148 ** arg This is the pointer to anything which will be passed as the
19149 ** first argument to "func". Use it for whatever you like.
19150 **
19151 ** fmt This is the format string, as in the usual print.
19152 **
19153 ** ap This is a pointer to a list of arguments. Same as in
19154 ** vfprint.
19155 **
19156 ** OUTPUTS:
19157 ** The return value is the total number of characters sent to
19158 ** the function "func". Returns -1 on a error.
19159 **
19160 ** Note that the order in which automatic variables are declared below
19161 ** seems to make a big difference in determining how fast this beast
19162 ** will run.
19163 */
19164 SQLITE_PRIVATE void sqlite3VXPrintf(
19165 StrAccum *pAccum, /* Accumulate results here */
19166 int useExtended, /* Allow extended %-conversions */
19167 const char *fmt, /* Format string */
@@ -19180,28 +19138,27 @@
19180 etByte flag_altform2; /* True if "!" flag is present */
19181 etByte flag_zeropad; /* True if field width constant starts with zero */
19182 etByte flag_long; /* True if "l" flag is present */
19183 etByte flag_longlong; /* True if the "ll" flag is present */
19184 etByte done; /* Loop termination flag */
 
 
19185 sqlite_uint64 longvalue; /* Value for integer types */
19186 LONGDOUBLE_TYPE realvalue; /* Value for real types */
19187 const et_info *infop; /* Pointer to the appropriate info structure */
19188 char buf[etBUFSIZE]; /* Conversion buffer */
19189 char *zOut; /* Rendering buffer */
19190 int nOut; /* Size of the rendering buffer */
19191 char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
19192 etByte xtype = 0; /* Conversion paradigm */
19193 char *zExtra; /* Extra memory used for etTCLESCAPE conversions */
19194 #ifndef SQLITE_OMIT_FLOATING_POINT
19195 int exp, e2; /* exponent of real numbers */
 
19196 double rounder; /* Used for rounding floating point values */
19197 etByte flag_dp; /* True if decimal point should be shown */
19198 etByte flag_rtz; /* True if trailing zeros should be removed */
19199 int nsd; /* Number of significant digits returned */
19200 #endif
 
19201
19202 length = 0;
19203 bufpt = 0;
19204 for(; (c=(*fmt))!=0; ++fmt){
19205 if( c!='%' ){
19206 int amt;
19207 bufpt = (char *)fmt;
@@ -19692,10 +19649,11 @@
19692 if( p->tooBig | p->mallocFailed ){
19693 testcase(p->tooBig);
19694 testcase(p->mallocFailed);
19695 return;
19696 }
 
19697 if( N<0 ){
19698 N = sqlite3Strlen30(z);
19699 }
19700 if( N==0 || NEVER(z==0) ){
19701 return;
@@ -19723,19 +19681,20 @@
19723 zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc);
19724 }else{
19725 zNew = sqlite3_realloc(zOld, p->nAlloc);
19726 }
19727 if( zNew ){
19728 if( zOld==0 ) memcpy(zNew, p->zText, p->nChar);
19729 p->zText = zNew;
19730 }else{
19731 p->mallocFailed = 1;
19732 sqlite3StrAccumReset(p);
19733 return;
19734 }
19735 }
19736 }
 
19737 memcpy(&p->zText[p->nChar], z, N);
19738 p->nChar += N;
19739 }
19740
19741 /*
@@ -25172,11 +25131,11 @@
25172 return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
25173 }
25174 #endif
25175
25176
25177 #ifdef SQLITE_DEBUG
25178 /*
25179 ** Helper function for printing out trace information from debugging
25180 ** binaries. This returns the string represetation of the supplied
25181 ** integer lock-type.
25182 */
@@ -26007,18 +25966,18 @@
26007 ** locking a random byte from a range, concurrent SHARED locks may exist
26008 ** even if the locking primitive used is always a write-lock.
26009 */
26010 int rc = SQLITE_OK;
26011 unixFile *pFile = (unixFile*)id;
26012 unixInodeInfo *pInode = pFile->pInode;
26013 struct flock lock;
26014 int tErrno = 0;
26015
26016 assert( pFile );
26017 OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h,
26018 azFileLock(eFileLock), azFileLock(pFile->eFileLock),
26019 azFileLock(pInode->eFileLock), pInode->nShared , getpid()));
26020
26021 /* If there is already a lock of this type or more restrictive on the
26022 ** unixFile, do nothing. Don't use the end_lock: exit path, as
26023 ** unixEnterMutex() hasn't been called yet.
26024 */
@@ -26218,11 +26177,10 @@
26218 static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
26219 unixFile *pFile = (unixFile*)id;
26220 unixInodeInfo *pInode;
26221 struct flock lock;
26222 int rc = SQLITE_OK;
26223 int h;
26224
26225 assert( pFile );
26226 OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock,
26227 pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared,
26228 getpid()));
@@ -26230,18 +26188,14 @@
26230 assert( eFileLock<=SHARED_LOCK );
26231 if( pFile->eFileLock<=eFileLock ){
26232 return SQLITE_OK;
26233 }
26234 unixEnterMutex();
26235 h = pFile->h;
26236 pInode = pFile->pInode;
26237 assert( pInode->nShared!=0 );
26238 if( pFile->eFileLock>SHARED_LOCK ){
26239 assert( pInode->eFileLock==pFile->eFileLock );
26240 SimulateIOErrorBenign(1);
26241 SimulateIOError( h=(-1) )
26242 SimulateIOErrorBenign(0);
26243
26244 #ifndef NDEBUG
26245 /* When reducing a lock such that other processes can start
26246 ** reading the database file again, make sure that the
26247 ** transaction counter was updated if any part of the database
@@ -26248,15 +26202,10 @@
26248 ** file changed. If the transaction counter is not updated,
26249 ** other connections to the same file might not realize that
26250 ** the file has changed and hence might not know to flush their
26251 ** cache. The use of a stale cache can lead to database corruption.
26252 */
26253 #if 0
26254 assert( pFile->inNormalWrite==0
26255 || pFile->dbUpdate==0
26256 || pFile->transCntrChng==1 );
26257 #endif
26258 pFile->inNormalWrite = 0;
26259 #endif
26260
26261 /* downgrading to a shared lock on NFS involves clearing the write lock
26262 ** before establishing the readlock - to avoid a race condition we downgrade
@@ -26354,13 +26303,10 @@
26354 pInode->nShared--;
26355 if( pInode->nShared==0 ){
26356 lock.l_type = F_UNLCK;
26357 lock.l_whence = SEEK_SET;
26358 lock.l_start = lock.l_len = 0L;
26359 SimulateIOErrorBenign(1);
26360 SimulateIOError( h=(-1) )
26361 SimulateIOErrorBenign(0);
26362 if( unixFileLock(pFile, &lock)==0 ){
26363 pInode->eFileLock = NO_LOCK;
26364 }else{
26365 rc = SQLITE_IOERR_UNLOCK;
26366 pFile->lastErrno = errno;
@@ -29191,10 +29137,13 @@
29191 assert( zFilename==0 || zFilename[0]=='/'
29192 || pVfs->pAppData==(void*)&autolockIoFinder );
29193 #else
29194 assert( zFilename==0 || zFilename[0]=='/' );
29195 #endif
 
 
 
29196
29197 OSTRACE(("OPEN %-3d %s\n", h, zFilename));
29198 pNew->h = h;
29199 pNew->zPath = zFilename;
29200 if( memcmp(pVfs->zName,"unix-excl",10)==0 ){
@@ -29293,10 +29242,11 @@
29293 /* Dotfile locking uses the file path so it needs to be included in
29294 ** the dotlockLockingContext
29295 */
29296 char *zLockFile;
29297 int nFilename;
 
29298 nFilename = (int)strlen(zFilename) + 6;
29299 zLockFile = (char *)sqlite3_malloc(nFilename);
29300 if( zLockFile==0 ){
29301 rc = SQLITE_NOMEM;
29302 }else{
@@ -30072,14 +30022,16 @@
30072 ** the current time and date as a Julian Day number times 86_400_000. In
30073 ** other words, write into *piNow the number of milliseconds since the Julian
30074 ** epoch of noon in Greenwich on November 24, 4714 B.C according to the
30075 ** proleptic Gregorian calendar.
30076 **
30077 ** On success, return 0. Return 1 if the time and date cannot be found.
 
30078 */
30079 static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){
30080 static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
 
30081 #if defined(NO_GETTOD)
30082 time_t t;
30083 time(&t);
30084 *piNow = ((sqlite3_int64)t)*1000 + unixEpoch;
30085 #elif OS_VXWORKS
@@ -30086,34 +30038,38 @@
30086 struct timespec sNow;
30087 clock_gettime(CLOCK_REALTIME, &sNow);
30088 *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000;
30089 #else
30090 struct timeval sNow;
30091 gettimeofday(&sNow, 0);
30092 *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000;
 
 
 
30093 #endif
30094
30095 #ifdef SQLITE_TEST
30096 if( sqlite3_current_time ){
30097 *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
30098 }
30099 #endif
30100 UNUSED_PARAMETER(NotUsed);
30101 return 0;
30102 }
30103
30104 /*
30105 ** Find the current time (in Universal Coordinated Time). Write the
30106 ** current time and date as a Julian Day number into *prNow and
30107 ** return 0. Return 1 if the time and date cannot be found.
30108 */
30109 static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){
30110 sqlite3_int64 i;
 
30111 UNUSED_PARAMETER(NotUsed);
30112 unixCurrentTimeInt64(0, &i);
30113 *prNow = i/86400000.0;
30114 return 0;
30115 }
30116
30117 /*
30118 ** We added the xGetLastError() method with the intention of providing
30119 ** better low-level error messages when operating-system problems come up
@@ -34612,11 +34568,11 @@
34612 }
34613 static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){
34614 UNUSED_PARAMETER(pVfs);
34615 getLastErrorMsg(nBuf, zBufOut);
34616 }
34617 void (*winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol))(void){
34618 UNUSED_PARAMETER(pVfs);
34619 #if SQLITE_OS_WINCE
34620 /* The GetProcAddressA() routine is only available on wince. */
34621 return (void(*)(void))GetProcAddressA((HANDLE)pHandle, zSymbol);
34622 #else
@@ -34623,11 +34579,11 @@
34623 /* All other windows platforms expect GetProcAddress() to take
34624 ** an Ansi string regardless of the _UNICODE setting */
34625 return (void(*)(void))GetProcAddress((HANDLE)pHandle, zSymbol);
34626 #endif
34627 }
34628 void winDlClose(sqlite3_vfs *pVfs, void *pHandle){
34629 UNUSED_PARAMETER(pVfs);
34630 FreeLibrary((HANDLE)pHandle);
34631 }
34632 #else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
34633 #define winDlOpen 0
@@ -34697,11 +34653,12 @@
34697 ** the current time and date as a Julian Day number times 86_400_000. In
34698 ** other words, write into *piNow the number of milliseconds since the Julian
34699 ** epoch of noon in Greenwich on November 24, 4714 B.C according to the
34700 ** proleptic Gregorian calendar.
34701 **
34702 ** On success, return 0. Return 1 if the time and date cannot be found.
 
34703 */
34704 static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){
34705 /* FILETIME structure is a 64-bit value representing the number of
34706 100-nanosecond intervals since January 1, 1601 (= JD 2305813.5).
34707 */
@@ -34717,11 +34674,11 @@
34717 #if SQLITE_OS_WINCE
34718 SYSTEMTIME time;
34719 GetSystemTime(&time);
34720 /* if SystemTimeToFileTime() fails, it returns zero. */
34721 if (!SystemTimeToFileTime(&time,&ft)){
34722 return 1;
34723 }
34724 #else
34725 GetSystemTimeAsFileTime( &ft );
34726 #endif
34727
@@ -34733,19 +34690,19 @@
34733 if( sqlite3_current_time ){
34734 *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
34735 }
34736 #endif
34737 UNUSED_PARAMETER(pVfs);
34738 return 0;
34739 }
34740
34741 /*
34742 ** Find the current time (in Universal Coordinated Time). Write the
34743 ** current time and date as a Julian Day number into *prNow and
34744 ** return 0. Return 1 if the time and date cannot be found.
34745 */
34746 int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){
34747 int rc;
34748 sqlite3_int64 i;
34749 rc = winCurrentTimeInt64(pVfs, &i);
34750 if( !rc ){
34751 *prNow = i/86400000.0;
@@ -40068,11 +40025,10 @@
40068 needPagerReset = 0;
40069 }
40070 rc = pager_playback_one_page(pPager,&pPager->journalOff,0,1,0);
40071 if( rc!=SQLITE_OK ){
40072 if( rc==SQLITE_DONE ){
40073 rc = SQLITE_OK;
40074 pPager->journalOff = szJ;
40075 break;
40076 }else if( rc==SQLITE_IOERR_SHORT_READ ){
40077 /* If the journal has been truncated, simply stop reading and
40078 ** processing the journal. This might happen if the journal was
@@ -40330,10 +40286,11 @@
40330 #if defined(SQLITE_DEBUG) || defined(SQLITE_CHECK_PAGES)
40331 PgHdr *p; /* For looping over pages */
40332 #endif
40333
40334 assert( pPager->pWal );
 
40335 #ifdef SQLITE_DEBUG
40336 /* Verify that the page list is in accending order */
40337 for(p=pList; p && p->pDirty; p=p->pDirty){
40338 assert( p->pgno < p->pDirty->pgno );
40339 }
@@ -46566,11 +46523,11 @@
46566 */
46567 if( iRead ){
46568 int sz;
46569 i64 iOffset;
46570 sz = pWal->hdr.szPage;
46571 sz = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16);
46572 testcase( sz<=32768 );
46573 testcase( sz>=65536 );
46574 iOffset = walFrameOffset(iRead, sz) + WAL_FRAME_HDRSIZE;
46575 *pInWal = 1;
46576 /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */
@@ -49879,21 +49836,23 @@
49879 */
49880 if( isMemdb==0 && isTempDb==0 ){
49881 if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){
49882 int nFullPathname = pVfs->mxPathname+1;
49883 char *zFullPathname = sqlite3Malloc(nFullPathname);
49884 sqlite3_mutex *mutexShared;
49885 p->sharable = 1;
49886 if( !zFullPathname ){
49887 sqlite3_free(p);
49888 return SQLITE_NOMEM;
49889 }
49890 sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname);
 
49891 mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN);
49892 sqlite3_mutex_enter(mutexOpen);
49893 mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
49894 sqlite3_mutex_enter(mutexShared);
 
49895 for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){
49896 assert( pBt->nRef>0 );
49897 if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager))
49898 && sqlite3PagerVfs(pBt->pPager)==pVfs ){
49899 int iDb;
@@ -49995,13 +49954,13 @@
49995
49996 #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
49997 /* Add the new BtShared object to the linked list sharable BtShareds.
49998 */
49999 if( p->sharable ){
50000 sqlite3_mutex *mutexShared;
50001 pBt->nRef = 1;
50002 mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
50003 if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){
50004 pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST);
50005 if( pBt->mutex==0 ){
50006 rc = SQLITE_NOMEM;
50007 db->mallocFailed = 0;
@@ -50079,16 +50038,16 @@
50079 ** true if the BtShared.nRef counter reaches zero and return
50080 ** false if it is still positive.
50081 */
50082 static int removeFromSharingList(BtShared *pBt){
50083 #ifndef SQLITE_OMIT_SHARED_CACHE
50084 sqlite3_mutex *pMaster;
50085 BtShared *pList;
50086 int removed = 0;
50087
50088 assert( sqlite3_mutex_notheld(pBt->mutex) );
50089 pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
50090 sqlite3_mutex_enter(pMaster);
50091 pBt->nRef--;
50092 if( pBt->nRef<=0 ){
50093 if( GLOBAL(BtShared*,sqlite3SharedCacheList)==pBt ){
50094 GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt->pNext;
@@ -52698,11 +52657,10 @@
52698 }
52699 }
52700 if( c==0 ){
52701 if( pPage->intKey && !pPage->leaf ){
52702 lwr = idx;
52703 upr = lwr - 1;
52704 break;
52705 }else{
52706 *pRes = 0;
52707 rc = SQLITE_OK;
52708 goto moveto_finish;
@@ -52716,11 +52674,11 @@
52716 if( lwr>upr ){
52717 break;
52718 }
52719 pCur->aiIdx[pCur->iPage] = (u16)(idx = (lwr+upr)/2);
52720 }
52721 assert( lwr==upr+1 );
52722 assert( pPage->isInit );
52723 if( pPage->leaf ){
52724 chldPg = 0;
52725 }else if( lwr>=pPage->nCell ){
52726 chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]);
@@ -52981,10 +52939,12 @@
52981 }
52982 if( rc ){
52983 pTrunk = 0;
52984 goto end_allocate_page;
52985 }
 
 
52986
52987 k = get4byte(&pTrunk->aData[4]); /* # of leaves on this trunk page */
52988 if( k==0 && !searchList ){
52989 /* The trunk has no leaves and the list is not being searched.
52990 ** So extract the trunk page itself and use it as the newly
@@ -54108,17 +54068,19 @@
54108 ** This is safe because dropping a cell only overwrites the first
54109 ** four bytes of it, and this function does not need the first
54110 ** four bytes of the divider cell. So the pointer is safe to use
54111 ** later on.
54112 **
54113 ** Unless SQLite is compiled in secure-delete mode. In this case,
54114 ** the dropCell() routine will overwrite the entire cell with zeroes.
54115 ** In this case, temporarily copy the cell into the aOvflSpace[]
54116 ** buffer. It will be copied out again as soon as the aSpace[] buffer
54117 ** is allocated. */
54118 if( pBt->secureDelete ){
54119 int iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData);
 
 
54120 if( (iOff+szNew[i])>(int)pBt->usableSize ){
54121 rc = SQLITE_CORRUPT_BKPT;
54122 memset(apOld, 0, (i+1)*sizeof(MemPage*));
54123 goto balance_cleanup;
54124 }else{
@@ -54534,10 +54496,11 @@
54534 int isDivider = 0;
54535 while( i==iNextOld ){
54536 /* Cell i is the cell immediately following the last cell on old
54537 ** sibling page j. If the siblings are not leaf pages of an
54538 ** intkey b-tree, then cell i was a divider cell. */
 
54539 pOld = apCopy[++j];
54540 iNextOld = i + !leafData + pOld->nCell + pOld->nOverflow;
54541 if( pOld->nOverflow ){
54542 nOverflow = pOld->nOverflow;
54543 iOverflow = i + !leafData + pOld->aOvfl[0].idx;
@@ -56876,18 +56839,18 @@
56876 /*
56877 ** Release all resources associated with an sqlite3_backup* handle.
56878 */
56879 SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){
56880 sqlite3_backup **pp; /* Ptr to head of pagers backup list */
56881 sqlite3_mutex *mutex; /* Mutex to protect source database */
56882 int rc; /* Value to return */
56883
56884 /* Enter the mutexes */
56885 if( p==0 ) return SQLITE_OK;
56886 sqlite3_mutex_enter(p->pSrcDb->mutex);
56887 sqlite3BtreeEnter(p->pSrc);
56888 mutex = p->pSrcDb->mutex;
56889 if( p->pDestDb ){
56890 sqlite3_mutex_enter(p->pDestDb->mutex);
56891 }
56892
56893 /* Detach this backup from the source pager. */
@@ -58983,34 +58946,33 @@
58983 ** Change the comment on the the most recently coded instruction. Or
58984 ** insert a No-op and add the comment to that new instruction. This
58985 ** makes the code easier to read during debugging. None of this happens
58986 ** in a production build.
58987 */
58988 SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){
58989 va_list ap;
58990 if( !p ) return;
58991 assert( p->nOp>0 || p->aOp==0 );
58992 assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed );
58993 if( p->nOp ){
58994 char **pz = &p->aOp[p->nOp-1].zComment;
 
 
 
 
 
 
 
58995 va_start(ap, zFormat);
58996 sqlite3DbFree(p->db, *pz);
58997 *pz = sqlite3VMPrintf(p->db, zFormat, ap);
58998 va_end(ap);
58999 }
59000 }
59001 SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){
59002 va_list ap;
59003 if( !p ) return;
59004 sqlite3VdbeAddOp0(p, OP_Noop);
59005 assert( p->nOp>0 || p->aOp==0 );
59006 assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed );
59007 if( p->nOp ){
59008 char **pz = &p->aOp[p->nOp-1].zComment;
59009 va_start(ap, zFormat);
59010 sqlite3DbFree(p->db, *pz);
59011 *pz = sqlite3VMPrintf(p->db, zFormat, ap);
59012 va_end(ap);
59013 }
59014 }
59015 #endif /* NDEBUG */
59016
@@ -61266,11 +61228,11 @@
61266 ** than 2GiB are support - anything large must be database corruption.
61267 ** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so
61268 ** this code can safely assume that nCellKey is 32-bits
61269 */
61270 assert( sqlite3BtreeCursorIsValid(pCur) );
61271 rc = sqlite3BtreeKeySize(pCur, &nCellKey);
61272 assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
61273 assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey );
61274
61275 /* Read in the complete content of the index entry */
61276 memset(&m, 0, sizeof(m));
@@ -61341,11 +61303,11 @@
61341 int rc;
61342 BtCursor *pCur = pC->pCursor;
61343 Mem m;
61344
61345 assert( sqlite3BtreeCursorIsValid(pCur) );
61346 rc = sqlite3BtreeKeySize(pCur, &nCellKey);
61347 assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
61348 /* nCellKey will always be between 0 and 0xffffffff because of the say
61349 ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */
61350 if( nCellKey<=0 || nCellKey>0x7fffffff ){
61351 *res = 0;
@@ -65617,20 +65579,20 @@
65617 }else if( u.am.pC->cacheStatus==p->cacheCtr ){
65618 u.am.payloadSize = u.am.pC->payloadSize;
65619 u.am.zRec = (char*)u.am.pC->aRow;
65620 }else if( u.am.pC->isIndex ){
65621 assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) );
65622 rc = sqlite3BtreeKeySize(u.am.pCrsr, &u.am.payloadSize64);
65623 assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
65624 /* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the
65625 ** payload size, so it is impossible for u.am.payloadSize64 to be
65626 ** larger than 32 bits. */
65627 assert( (u.am.payloadSize64 & SQLITE_MAX_U32)==(u64)u.am.payloadSize64 );
65628 u.am.payloadSize = (u32)u.am.payloadSize64;
65629 }else{
65630 assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) );
65631 rc = sqlite3BtreeDataSize(u.am.pCrsr, &u.am.payloadSize);
65632 assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
65633 }
65634 }else if( ALWAYS(u.am.pC->pseudoTableReg>0) ){
65635 u.am.pReg = &aMem[u.am.pC->pseudoTableReg];
65636 assert( u.am.pReg->flags & MEM_Blob );
@@ -67678,18 +67640,18 @@
67678 rc = sqlite3VdbeCursorMoveto(u.bk.pC);
67679 if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
67680
67681 if( u.bk.pC->isIndex ){
67682 assert( !u.bk.pC->isTable );
67683 rc = sqlite3BtreeKeySize(u.bk.pCrsr, &u.bk.n64);
67684 assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
67685 if( u.bk.n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){
67686 goto too_big;
67687 }
67688 u.bk.n = (u32)u.bk.n64;
67689 }else{
67690 rc = sqlite3BtreeDataSize(u.bk.pCrsr, &u.bk.n);
67691 assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
67692 if( u.bk.n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
67693 goto too_big;
67694 }
67695 }
@@ -73322,11 +73284,12 @@
73322 pNew->flags |= EP_IntValue;
73323 pNew->u.iValue = iValue;
73324 }else{
73325 int c;
73326 pNew->u.zToken = (char*)&pNew[1];
73327 memcpy(pNew->u.zToken, pToken->z, pToken->n);
 
73328 pNew->u.zToken[pToken->n] = 0;
73329 if( dequote && nExtra>=3
73330 && ((c = pToken->z[0])=='\'' || c=='"' || c=='[' || c=='`') ){
73331 sqlite3Dequote(pNew->u.zToken);
73332 if( c=='"' ) pNew->flags |= EP_DblQuoted;
@@ -74361,15 +74324,23 @@
74361 ** ephemeral table.
74362 */
74363 p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0);
74364 if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){
74365 sqlite3 *db = pParse->db; /* Database connection */
74366 Expr *pExpr = p->pEList->a[0].pExpr; /* Expression <column> */
74367 int iCol = pExpr->iColumn; /* Index of column <column> */
74368 Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */
74369 Table *pTab = p->pSrc->a[0].pTab; /* Table <table>. */
 
 
74370 int iDb; /* Database idx for pTab */
 
 
 
 
 
 
 
 
74371
74372 /* Code an OP_VerifyCookie and OP_TableLock for <table>. */
74373 iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
74374 sqlite3CodeVerifySchema(pParse, iDb);
74375 sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
@@ -76372,11 +76343,11 @@
76372 if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){
76373 return 2;
76374 }
76375 }else if( pA->op!=TK_COLUMN && pA->u.zToken ){
76376 if( ExprHasProperty(pB, EP_IntValue) || NEVER(pB->u.zToken==0) ) return 2;
76377 if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ){
76378 return 2;
76379 }
76380 }
76381 if( (pA->flags & EP_ExpCollate)!=(pB->flags & EP_ExpCollate) ) return 1;
76382 if( (pA->flags & EP_ExpCollate)!=0 && pA->pColl!=pB->pColl ) return 2;
@@ -81778,17 +81749,19 @@
81778 */
81779 static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
81780 Table *pTab = pIndex->pTable; /* The table that is indexed */
81781 int iTab = pParse->nTab++; /* Btree cursor used for pTab */
81782 int iIdx = pParse->nTab++; /* Btree cursor used for pIndex */
81783 int iSorter = iTab; /* Cursor opened by OpenSorter (if in use) */
81784 int addr1; /* Address of top of loop */
81785 int addr2; /* Address to jump to for next iteration */
81786 int tnum; /* Root page of index */
81787 Vdbe *v; /* Generate code into this virtual machine */
81788 KeyInfo *pKey; /* KeyInfo for index */
 
81789 int regIdxKey; /* Registers containing the index key */
 
81790 int regRecord; /* Register holding assemblied index record */
81791 sqlite3 *db = pParse->db; /* The database connection */
81792 int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
81793
81794 #ifndef SQLITE_OMIT_AUTHORIZATION
@@ -81818,21 +81791,22 @@
81818
81819 #ifndef SQLITE_OMIT_MERGE_SORT
81820 /* Open the sorter cursor if we are to use one. */
81821 iSorter = pParse->nTab++;
81822 sqlite3VdbeAddOp4(v, OP_SorterOpen, iSorter, 0, 0, (char*)pKey, P4_KEYINFO);
 
 
81823 #endif
81824
81825 /* Open the table. Loop through all rows of the table, inserting index
81826 ** records into the sorter. */
81827 sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
81828 addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0);
81829 addr2 = addr1 + 1;
81830 regRecord = sqlite3GetTempReg(pParse);
81831 regIdxKey = sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
81832
81833 #ifndef SQLITE_OMIT_MERGE_SORT
 
81834 sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord);
81835 sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1);
81836 sqlite3VdbeJumpHere(v, addr1);
81837 addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0);
81838 if( pIndex->onError!=OE_None ){
@@ -81848,10 +81822,12 @@
81848 }
81849 sqlite3VdbeAddOp2(v, OP_SorterData, iSorter, regRecord);
81850 sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 1);
81851 sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
81852 #else
 
 
81853 if( pIndex->onError!=OE_None ){
81854 const int regRowid = regIdxKey + pIndex->nColumn;
81855 const int j2 = sqlite3VdbeCurrentAddr(v) + 2;
81856 void * const pRegKey = SQLITE_INT_TO_PTR(regIdxKey);
81857
@@ -81945,10 +81921,11 @@
81945 ** before looking up the table.
81946 */
81947 assert( pName1 && pName2 );
81948 iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
81949 if( iDb<0 ) goto exit_create_index;
 
81950
81951 #ifndef SQLITE_OMIT_TEMPDB
81952 /* If the index name was unqualified, check if the the table
81953 ** is a temp table. If so, set the database to 1. Do not do this
81954 ** if initialising a database schema.
@@ -81972,10 +81949,11 @@
81972 pTblName->a[0].zDatabase);
81973 if( !pTab || db->mallocFailed ) goto exit_create_index;
81974 assert( db->aDb[iDb].pSchema==pTab->pSchema );
81975 }else{
81976 assert( pName==0 );
 
81977 pTab = pParse->pNewTable;
81978 if( !pTab ) goto exit_create_index;
81979 iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
81980 }
81981 pDb = &db->aDb[iDb];
@@ -82014,10 +81992,11 @@
82014 ** own name.
82015 */
82016 if( pName ){
82017 zName = sqlite3NameFromToken(db, pName);
82018 if( zName==0 ) goto exit_create_index;
 
82019 if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
82020 goto exit_create_index;
82021 }
82022 if( !db->init.busy ){
82023 if( sqlite3FindTable(db, zName, 0)!=0 ){
@@ -82869,17 +82848,14 @@
82869
82870 /*
82871 ** Commit a transaction
82872 */
82873 SQLITE_PRIVATE void sqlite3CommitTransaction(Parse *pParse){
82874 sqlite3 *db;
82875 Vdbe *v;
82876
82877 assert( pParse!=0 );
82878 db = pParse->db;
82879 assert( db!=0 );
82880 /* if( db->aDb[0].pBt==0 ) return; */
82881 if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ){
82882 return;
82883 }
82884 v = sqlite3GetVdbe(pParse);
82885 if( v ){
@@ -82889,17 +82865,14 @@
82889
82890 /*
82891 ** Rollback a transaction
82892 */
82893 SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse *pParse){
82894 sqlite3 *db;
82895 Vdbe *v;
82896
82897 assert( pParse!=0 );
82898 db = pParse->db;
82899 assert( db!=0 );
82900 /* if( db->aDb[0].pBt==0 ) return; */
82901 if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ){
82902 return;
82903 }
82904 v = sqlite3GetVdbe(pParse);
82905 if( v ){
@@ -84701,20 +84674,19 @@
84701 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
84702 assert( z2==(char*)sqlite3_value_text(argv[0]) );
84703 if( z2 ){
84704 z1 = contextMalloc(context, ((i64)n)+1);
84705 if( z1 ){
84706 memcpy(z1, z2, n+1);
84707 for(i=0; z1[i]; i++){
84708 z1[i] = (char)sqlite3Toupper(z1[i]);
84709 }
84710 sqlite3_result_text(context, z1, -1, sqlite3_free);
84711 }
84712 }
84713 }
84714 static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
84715 u8 *z1;
84716 const char *z2;
84717 int i, n;
84718 UNUSED_PARAMETER(argc);
84719 z2 = (char*)sqlite3_value_text(argv[0]);
84720 n = sqlite3_value_bytes(argv[0]);
@@ -84721,15 +84693,14 @@
84721 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
84722 assert( z2==(char*)sqlite3_value_text(argv[0]) );
84723 if( z2 ){
84724 z1 = contextMalloc(context, ((i64)n)+1);
84725 if( z1 ){
84726 memcpy(z1, z2, n+1);
84727 for(i=0; z1[i]; i++){
84728 z1[i] = sqlite3Tolower(z1[i]);
84729 }
84730 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
84731 }
84732 }
84733 }
84734
84735
@@ -87102,10 +87073,11 @@
87102 sqlite3SelectDelete(db, pSelect);
87103 if( db->mallocFailed==1 ){
87104 fkTriggerDelete(db, pTrigger);
87105 return 0;
87106 }
 
87107
87108 switch( action ){
87109 case OE_Restrict:
87110 pStep->op = TK_SELECT;
87111 break;
@@ -90025,11 +89997,11 @@
90025 sqlite3_vfs *pVfs = db->pVfs;
90026 void *handle;
90027 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
90028 char *zErrmsg = 0;
90029 void **aHandle;
90030 const int nMsg = 300;
90031
90032 if( pzErrMsg ) *pzErrMsg = 0;
90033
90034 /* Ticket #1863. To avoid a creating security problems for older
90035 ** applications that relink against newer versions of SQLite, the
@@ -90062,10 +90034,11 @@
90062 }
90063 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*))
90064 sqlite3OsDlSym(pVfs, handle, zProc);
90065 if( xInit==0 ){
90066 if( pzErrMsg ){
 
90067 *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg);
90068 if( zErrmsg ){
90069 sqlite3_snprintf(nMsg, zErrmsg,
90070 "no entry point [%s] in shared library [%s]", zProc,zFile);
90071 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
@@ -90747,11 +90720,11 @@
90747 ){
90748 int iReg;
90749 if( sqlite3ReadSchema(pParse) ) goto pragma_out;
90750 sqlite3CodeVerifySchema(pParse, iDb);
90751 iReg = ++pParse->nMem;
90752 if( zLeft[0]=='p' ){
90753 sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg);
90754 }else{
90755 sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, sqlite3Atoi(zRight));
90756 }
90757 sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1);
@@ -91360,11 +91333,11 @@
91360 { OP_IfNeg, 1, 0, 0}, /* 1 */
91361 { OP_String8, 0, 3, 0}, /* 2 */
91362 { OP_ResultRow, 3, 1, 0},
91363 };
91364
91365 int isQuick = (zLeft[0]=='q');
91366
91367 /* Initialize the VDBE program */
91368 if( sqlite3ReadSchema(pParse) ) goto pragma_out;
91369 pParse->nMem = 6;
91370 sqlite3VdbeSetNumCols(v, 1);
@@ -93942,11 +93915,14 @@
93942 /* If the column contains an "AS <name>" phrase, use <name> as the name */
93943 zName = sqlite3DbStrDup(db, zName);
93944 }else{
93945 Expr *pColExpr = p; /* The expression that is the result column name */
93946 Table *pTab; /* Table associated with this expression */
93947 while( pColExpr->op==TK_DOT ) pColExpr = pColExpr->pRight;
 
 
 
93948 if( pColExpr->op==TK_COLUMN && ALWAYS(pColExpr->pTab!=0) ){
93949 /* For columns use the column name name */
93950 int iCol = pColExpr->iColumn;
93951 pTab = pColExpr->pTab;
93952 if( iCol<0 ) iCol = pTab->iPKey;
@@ -98940,10 +98916,11 @@
98940 break;
98941 }
98942 }
98943 }
98944 for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
 
98945 if( openAll || aRegIdx[i]>0 ){
98946 KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx);
98947 sqlite3VdbeAddOp4(v, OP_OpenWrite, iCur+i+1, pIdx->tnum, iDb,
98948 (char*)pKey, P4_KEYINFO_HANDOFF);
98949 assert( pParse->nTab>iCur+i+1 );
@@ -99113,10 +99090,11 @@
99113 sqlite3VdbeAddOp2(v, OP_Goto, 0, addr);
99114 sqlite3VdbeJumpHere(v, addr);
99115
99116 /* Close all tables */
99117 for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
 
99118 if( openAll || aRegIdx[i]>0 ){
99119 sqlite3VdbeAddOp2(v, OP_Close, iCur+i+1, 0);
99120 }
99121 }
99122 sqlite3VdbeAddOp2(v, OP_Close, iCur, 0);
@@ -103144,11 +103122,10 @@
103144 assert( roundUp==0 || roundUp==1 );
103145 assert( pIdx->nSample>0 );
103146 if( pVal==0 ) return SQLITE_ERROR;
103147 n = pIdx->aiRowEst[0];
103148 aSample = pIdx->aSample;
103149 i = 0;
103150 eType = sqlite3_value_type(pVal);
103151
103152 if( eType==SQLITE_INTEGER ){
103153 v = sqlite3_value_int64(pVal);
103154 r = (i64)v;
@@ -105564,11 +105541,12 @@
105564 assert( bestJ>=0 );
105565 assert( notReady & getMask(pMaskSet, pTabList->a[bestJ].iCursor) );
105566 WHERETRACE(("*** Optimizer selects table %d for loop %d"
105567 " with cost=%g and nRow=%g\n",
105568 bestJ, pLevel-pWInfo->a, bestPlan.rCost, bestPlan.plan.nRow));
105569 if( (bestPlan.plan.wsFlags & WHERE_ORDERBY)!=0 ){
 
105570 *ppOrderBy = 0;
105571 }
105572 if( (bestPlan.plan.wsFlags & WHERE_DISTINCT)!=0 ){
105573 assert( pWInfo->eDistinct==0 );
105574 pWInfo->eDistinct = WHERE_DISTINCT_ORDERED;
@@ -109180,11 +109158,13 @@
109180 sqlite3ParserTOKENTYPE yyminor /* The value for the token */
109181 sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */
109182 ){
109183 YYMINORTYPE yyminorunion;
109184 int yyact; /* The parser action. */
 
109185 int yyendofinput; /* True if we are at the end of input */
 
109186 #ifdef YYERRORSYMBOL
109187 int yyerrorhit = 0; /* True if yymajor has invoked an error */
109188 #endif
109189 yyParser *yypParser; /* The parser */
109190
@@ -109203,11 +109183,13 @@
109203 yypParser->yyerrcnt = -1;
109204 yypParser->yystack[0].stateno = 0;
109205 yypParser->yystack[0].major = 0;
109206 }
109207 yyminorunion.yy0 = yyminor;
 
109208 yyendofinput = (yymajor==0);
 
109209 sqlite3ParserARG_STORE;
109210
109211 #ifndef NDEBUG
109212 if( yyTraceFILE ){
109213 fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]);
@@ -109215,11 +109197,10 @@
109215 #endif
109216
109217 do{
109218 yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
109219 if( yyact<YYNSTATE ){
109220 assert( !yyendofinput ); /* Impossible to shift the $ token */
109221 yy_shift(yypParser,yyact,yymajor,&yyminorunion);
109222 yypParser->yyerrcnt--;
109223 yymajor = YYNOCODE;
109224 }else if( yyact < YYNSTATE + YYNRULE ){
109225 yy_reduce(yypParser,yyact-YYNSTATE);
@@ -110607,11 +110588,11 @@
110607 **
110608 ** * Recursive calls to this routine from thread X return immediately
110609 ** without blocking.
110610 */
110611 SQLITE_API int sqlite3_initialize(void){
110612 sqlite3_mutex *pMaster; /* The main static mutex */
110613 int rc; /* Result code */
110614
110615 #ifdef SQLITE_OMIT_WSD
110616 rc = sqlite3_wsd_init(4096, 24);
110617 if( rc!=SQLITE_OK ){
@@ -110641,11 +110622,11 @@
110641 ** This operation is protected by the STATIC_MASTER mutex. Note that
110642 ** MutexAlloc() is called for a static mutex prior to initializing the
110643 ** malloc subsystem - this implies that the allocation of a static
110644 ** mutex must not require support from the malloc subsystem.
110645 */
110646 pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
110647 sqlite3_mutex_enter(pMaster);
110648 sqlite3GlobalConfig.isMutexInit = 1;
110649 if( !sqlite3GlobalConfig.isMallocInit ){
110650 rc = sqlite3MallocInit();
110651 }
@@ -111715,17 +111696,17 @@
111715 sqlite3 *db,
111716 const char *zName,
111717 int nArg
111718 ){
111719 int nName = sqlite3Strlen30(zName);
111720 int rc;
111721 sqlite3_mutex_enter(db->mutex);
111722 if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){
111723 sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
111724 0, sqlite3InvalidFunction, 0, 0, 0);
111725 }
111726 rc = sqlite3ApiExit(db, SQLITE_OK);
111727 sqlite3_mutex_leave(db->mutex);
111728 return rc;
111729 }
111730
111731 #ifndef SQLITE_OMIT_TRACE
@@ -112783,10 +112764,11 @@
112783 if( db ){
112784 assert( db->mutex!=0 || isThreadsafe==0 || sqlite3GlobalConfig.bFullMutex==0 );
112785 sqlite3_mutex_leave(db->mutex);
112786 }
112787 rc = sqlite3_errcode(db);
 
112788 if( rc==SQLITE_NOMEM ){
112789 sqlite3_close(db);
112790 db = 0;
112791 }else if( rc!=SQLITE_OK ){
112792 db->magic = SQLITE_MAGIC_SICK;
@@ -114511,10 +114493,17 @@
114511 #else
114512 # define TESTONLY(X)
114513 #endif
114514
114515 #endif /* SQLITE_AMALGAMATION */
 
 
 
 
 
 
 
114516
114517 typedef struct Fts3Table Fts3Table;
114518 typedef struct Fts3Cursor Fts3Cursor;
114519 typedef struct Fts3Expr Fts3Expr;
114520 typedef struct Fts3Phrase Fts3Phrase;
@@ -115012,11 +115001,11 @@
115012 char **pp,
115013 char *pStart,
115014 sqlite3_int64 *pVal
115015 ){
115016 sqlite3_int64 iVal;
115017 char *p = *pp;
115018
115019 /* Pointer p now points at the first byte past the varint we are
115020 ** interested in. So, unless the doclist is corrupt, the 0x80 bit is
115021 ** clear on character p[-1]. */
115022 for(p = (*pp)-2; p>=pStart && *p&0x80; p--);
@@ -115413,11 +115402,11 @@
115413 ** the output value undefined. Otherwise SQLITE_OK is returned.
115414 **
115415 ** This function is used when parsing the "prefix=" FTS4 parameter.
115416 */
115417 static int fts3GobbleInt(const char **pp, int *pnOut){
115418 const char *p = *pp; /* Iterator pointer */
115419 int nInt = 0; /* Output value */
115420
115421 for(p=*pp; p[0]>='0' && p[0]<='9'; p++){
115422 nInt = nInt * 10 + (p[0] - '0');
115423 }
@@ -115912,11 +115901,11 @@
115912 if( rc==SQLITE_OK ){
115913 /* If no row was found and no error has occured, then the %_content
115914 ** table is missing a row that is present in the full-text index.
115915 ** The data structures are corrupt.
115916 */
115917 rc = SQLITE_CORRUPT_VTAB;
115918 }
115919 pCsr->isEof = 1;
115920 if( pContext ){
115921 sqlite3_result_error_code(pContext, rc);
115922 }
@@ -115972,11 +115961,11 @@
115972 ** nNode bytes of content (see sqlite3Fts3ReadBlock() for details).
115973 */
115974 zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
115975 zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
115976 if( zCsr>zEnd ){
115977 return SQLITE_CORRUPT_VTAB;
115978 }
115979
115980 while( zCsr<zEnd && (piFirst || piLast) ){
115981 int cmp; /* memcmp() result */
115982 int nSuffix; /* Size of term suffix */
@@ -115990,11 +115979,11 @@
115990 }
115991 isFirstTerm = 0;
115992 zCsr += sqlite3Fts3GetVarint32(zCsr, &nSuffix);
115993
115994 if( nPrefix<0 || nSuffix<0 || &zCsr[nSuffix]>zEnd ){
115995 rc = SQLITE_CORRUPT_VTAB;
115996 goto finish_scan;
115997 }
115998 if( nPrefix+nSuffix>nAlloc ){
115999 char *zNew;
116000 nAlloc = (nPrefix+nSuffix) * 2;
@@ -116003,10 +115992,11 @@
116003 rc = SQLITE_NOMEM;
116004 goto finish_scan;
116005 }
116006 zBuffer = zNew;
116007 }
 
116008 memcpy(&zBuffer[nPrefix], zCsr, nSuffix);
116009 nBuffer = nPrefix + nSuffix;
116010 zCsr += nSuffix;
116011
116012 /* Compare the term we are searching for with the term just loaded from
@@ -117439,11 +117429,11 @@
117439 ** moves *ppPoslist so that it instead points to the first byte of the
117440 ** same position list.
117441 */
117442 static void fts3ReversePoslist(char *pStart, char **ppPoslist){
117443 char *p = &(*ppPoslist)[-2];
117444 char c;
117445
117446 while( p>pStart && (c=*p--)==0 );
117447 while( p>pStart && (*p & 0x80) | c ){
117448 c = *p--;
117449 }
@@ -118433,11 +118423,11 @@
118433 while( a<pEnd ){
118434 a += sqlite3Fts3GetVarint(a, &nByte);
118435 }
118436 if( nDoc==0 || nByte==0 ){
118437 sqlite3_reset(pStmt);
118438 return SQLITE_CORRUPT_VTAB;
118439 }
118440
118441 pCsr->nDoc = nDoc;
118442 pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz);
118443 assert( pCsr->nRowAvg>0 );
@@ -118909,12 +118899,15 @@
118909 }
118910
118911 aPoslist = pExpr->pRight->pPhrase->doclist.pList;
118912 nToken = pExpr->pRight->pPhrase->nToken;
118913 for(p=pExpr->pLeft; p && res; p=p->pLeft){
118914 int nNear = p->pParent->nNear;
118915 Fts3Phrase *pPhrase = (
 
 
 
118916 p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase
118917 );
118918 res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase);
118919 }
118920 }
@@ -119400,10 +119393,19 @@
119400 pPhrase->aToken[i].pSegcsr = 0;
119401 }
119402 }
119403 }
119404
 
 
 
 
 
 
 
 
 
119405 #if !SQLITE_CORE
119406 /*
119407 ** Initialize API pointer table, if required.
119408 */
119409 SQLITE_API int sqlite3_extension_init(
@@ -120197,12 +120199,16 @@
120197 p->pPhrase = (Fts3Phrase *)&p[1];
120198 p->pPhrase->iColumn = pParse->iDefaultCol;
120199 p->pPhrase->nToken = nToken;
120200
120201 zBuf = (char *)&p->pPhrase->aToken[nToken];
120202 memcpy(zBuf, zTemp, nTemp);
120203 sqlite3_free(zTemp);
 
 
 
 
120204
120205 for(jj=0; jj<p->pPhrase->nToken; jj++){
120206 p->pPhrase->aToken[jj].z = zBuf;
120207 zBuf += p->pPhrase->aToken[jj].n;
120208 }
@@ -122957,11 +122963,11 @@
122957 sqlite3_bind_int64(pStmt, 1, iDocid);
122958 }
122959 rc = sqlite3_step(pStmt);
122960 if( rc!=SQLITE_ROW || sqlite3_column_type(pStmt, 0)!=SQLITE_BLOB ){
122961 rc = sqlite3_reset(pStmt);
122962 if( rc==SQLITE_OK ) rc = SQLITE_CORRUPT_VTAB;
122963 pStmt = 0;
122964 }else{
122965 rc = SQLITE_OK;
122966 }
122967 }
@@ -123761,11 +123767,11 @@
123761 pNext += sqlite3Fts3GetVarint32(pNext, &nPrefix);
123762 pNext += sqlite3Fts3GetVarint32(pNext, &nSuffix);
123763 if( nPrefix<0 || nSuffix<=0
123764 || &pNext[nSuffix]>&pReader->aNode[pReader->nNode]
123765 ){
123766 return SQLITE_CORRUPT_VTAB;
123767 }
123768
123769 if( nPrefix+nSuffix>pReader->nTermAlloc ){
123770 int nNew = (nPrefix+nSuffix)*2;
123771 char *zNew = sqlite3_realloc(pReader->zTerm, nNew);
@@ -123791,11 +123797,11 @@
123791 ** of these statements is untrue, then the data structure is corrupt.
123792 */
123793 if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode]
123794 || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1])
123795 ){
123796 return SQLITE_CORRUPT_VTAB;
123797 }
123798 return SQLITE_OK;
123799 }
123800
123801 /*
@@ -125745,11 +125751,10 @@
125745 sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */
125746 ){
125747 Fts3Table *p = (Fts3Table *)pVtab;
125748 int rc = SQLITE_OK; /* Return Code */
125749 int isRemove = 0; /* True for an UPDATE or DELETE */
125750 sqlite3_int64 iRemove = 0; /* Rowid removed by UPDATE or DELETE */
125751 u32 *aSzIns = 0; /* Sizes of inserted documents */
125752 u32 *aSzDel; /* Sizes of deleted documents */
125753 int nChng = 0; /* Net change in number of documents */
125754 int bInsertDone = 0;
125755
@@ -125828,23 +125833,23 @@
125828 /* If this is a DELETE or UPDATE operation, remove the old record. */
125829 if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
125830 assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER );
125831 rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel);
125832 isRemove = 1;
125833 iRemove = sqlite3_value_int64(apVal[0]);
125834 }
125835
125836 /* If this is an INSERT or UPDATE operation, insert the new record. */
125837 if( nArg>1 && rc==SQLITE_OK ){
125838 if( bInsertDone==0 ){
125839 rc = fts3InsertData(p, apVal, pRowid);
125840 if( rc==SQLITE_CONSTRAINT ) rc = SQLITE_CORRUPT_VTAB;
125841 }
125842 if( rc==SQLITE_OK && (!isRemove || *pRowid!=iRemove) ){
125843 rc = fts3PendingTermsDocid(p, *pRowid);
125844 }
125845 if( rc==SQLITE_OK ){
 
125846 rc = fts3InsertTerms(p, apVal, aSzIns);
125847 }
125848 if( p->bHasDocsize ){
125849 fts3InsertDocsize(&rc, p, aSzIns);
125850 }
@@ -126734,11 +126739,11 @@
126734 pStmt = *ppStmt;
126735 assert( sqlite3_data_count(pStmt)==1 );
126736
126737 a = sqlite3_column_blob(pStmt, 0);
126738 a += sqlite3Fts3GetVarint(a, &nDoc);
126739 if( nDoc==0 ) return SQLITE_CORRUPT_VTAB;
126740 *pnDoc = (u32)nDoc;
126741
126742 if( paLen ) *paLen = a;
126743 return SQLITE_OK;
126744 }
@@ -127313,11 +127318,11 @@
127313 sqlite3_snprintf(sizeof(aBuffer), aBuffer,
127314 "%d %d %d %d ", iCol, pTerm-sCtx.aTerm, iStart, iEnd-iStart
127315 );
127316 rc = fts3StringAppend(&res, aBuffer, -1);
127317 }else if( rc==SQLITE_DONE ){
127318 rc = SQLITE_CORRUPT_VTAB;
127319 }
127320 }
127321 }
127322 if( rc==SQLITE_DONE ){
127323 rc = SQLITE_OK;
@@ -128654,11 +128659,12 @@
128654 pCsr->nConstraint = argc;
128655 if( !pCsr->aConstraint ){
128656 rc = SQLITE_NOMEM;
128657 }else{
128658 memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*argc);
128659 assert( (idxStr==0 && argc==0) || (int)strlen(idxStr)==argc*2 );
 
128660 for(ii=0; ii<argc; ii++){
128661 RtreeConstraint *p = &pCsr->aConstraint[ii];
128662 p->op = idxStr[ii*2];
128663 p->iCoord = idxStr[ii*2+1]-'a';
128664 if( p->op==RTREE_MATCH ){
@@ -128955,11 +128961,14 @@
128955 int iCell;
128956 sqlite3_int64 iBest = 0;
128957
128958 float fMinGrowth = 0.0;
128959 float fMinArea = 0.0;
 
128960 float fMinOverlap = 0.0;
 
 
128961
128962 int nCell = NCELL(pNode);
128963 RtreeCell cell;
128964 RtreeNode *pChild;
128965
@@ -128987,33 +128996,34 @@
128987 */
128988 for(iCell=0; iCell<nCell; iCell++){
128989 int bBest = 0;
128990 float growth;
128991 float area;
128992 float overlap = 0.0;
128993 nodeGetCell(pRtree, pNode, iCell, &cell);
128994 growth = cellGrowth(pRtree, &cell, pCell);
128995 area = cellArea(pRtree, &cell);
128996
128997 #if VARIANT_RSTARTREE_CHOOSESUBTREE
128998 if( ii==(pRtree->iDepth-1) ){
128999 overlap = cellOverlapEnlargement(pRtree,&cell,pCell,aCell,nCell,iCell);
 
 
129000 }
129001 if( (iCell==0)
129002 || (overlap<fMinOverlap)
129003 || (overlap==fMinOverlap && growth<fMinGrowth)
129004 || (overlap==fMinOverlap && growth==fMinGrowth && area<fMinArea)
129005 ){
129006 bBest = 1;
 
129007 }
129008 #else
129009 if( iCell==0||growth<fMinGrowth||(growth==fMinGrowth && area<fMinArea) ){
129010 bBest = 1;
129011 }
129012 #endif
129013 if( bBest ){
129014 fMinOverlap = overlap;
129015 fMinGrowth = growth;
129016 fMinArea = area;
129017 iBest = cell.iRowid;
129018 }
129019 }
129020
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -656,11 +656,11 @@
656 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
657 ** [sqlite_version()] and [sqlite_source_id()].
658 */
659 #define SQLITE_VERSION "3.7.9"
660 #define SQLITE_VERSION_NUMBER 3007009
661 #define SQLITE_SOURCE_ID "2011-10-15 00:16:30 39408702a989f907261c298bf0947f3e68bd10fe"
662
663 /*
664 ** CAPI3REF: Run-Time Library Version Numbers
665 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
666 **
@@ -3351,11 +3351,12 @@
3351 ** zSql string ends at either the first '\000' or '\u0000' character or
3352 ** the nByte-th byte, whichever comes first. If the caller knows
3353 ** that the supplied string is nul-terminated, then there is a small
3354 ** performance advantage to be gained by passing an nByte parameter that
3355 ** is equal to the number of bytes in the input string <i>including</i>
3356 ** the nul-terminator bytes as this saves SQLite from having to
3357 ** make a copy of the input string.
3358 **
3359 ** ^If pzTail is not NULL then *pzTail is made to point to the first byte
3360 ** past the end of the first SQL statement in zSql. These routines only
3361 ** compile the first statement in zSql, so *pzTail is left pointing to
3362 ** what remains uncompiled.
@@ -3572,10 +3573,17 @@
3573 ** ^(In those routines that have a fourth argument, its value is the
3574 ** number of bytes in the parameter. To be clear: the value is the
3575 ** number of <u>bytes</u> in the value, not the number of characters.)^
3576 ** ^If the fourth parameter is negative, the length of the string is
3577 ** the number of bytes up to the first zero terminator.
3578 ** If a non-negative fourth parameter is provided to sqlite3_bind_text()
3579 ** or sqlite3_bind_text16() then that parameter must be the byte offset
3580 ** where the NUL terminator would occur assuming the string were NUL
3581 ** terminated. If any NUL characters occur at byte offsets less than
3582 ** the value of the fourth parameter then the resulting string value will
3583 ** contain embedded NULs. The result of expressions involving strings
3584 ** with embedded NULs is undefined.
3585 **
3586 ** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
3587 ** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
3588 ** string after SQLite has finished with it. ^The destructor is called
3589 ** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(),
@@ -4590,11 +4598,16 @@
4598 ** is negative, then SQLite takes result text from the 2nd parameter
4599 ** through the first zero character.
4600 ** ^If the 3rd parameter to the sqlite3_result_text* interfaces
4601 ** is non-negative, then as many bytes (not characters) of the text
4602 ** pointed to by the 2nd parameter are taken as the application-defined
4603 ** function result. If the 3rd parameter is non-negative, then it
4604 ** must be the byte offset into the string where the NUL terminator would
4605 ** appear if the string where NUL terminated. If any NUL characters occur
4606 ** in the string at a byte offset that is less than the value of the 3rd
4607 ** parameter, then the resulting string will contain embedded NULs and the
4608 ** result of expressions operating on strings with embedded NULs is undefined.
4609 ** ^If the 4th parameter to the sqlite3_result_text* interfaces
4610 ** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that
4611 ** function as the destructor on the text or BLOB result when it has
4612 ** finished using that result.
4613 ** ^If the 4th parameter to the sqlite3_result_text* interfaces or to
@@ -9315,18 +9328,21 @@
9328 /*
9329 ** If this is a no-op implementation, implement everything as macros.
9330 */
9331 #define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8)
9332 #define sqlite3_mutex_free(X)
9333 #define sqlite3_mutex_enter(X)
9334 #define sqlite3_mutex_try(X) SQLITE_OK
9335 #define sqlite3_mutex_leave(X)
9336 #define sqlite3_mutex_held(X) ((void)(X),1)
9337 #define sqlite3_mutex_notheld(X) ((void)(X),1)
9338 #define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8)
9339 #define sqlite3MutexInit() SQLITE_OK
9340 #define sqlite3MutexEnd()
9341 #define MUTEX_LOGIC(X)
9342 #else
9343 #define MUTEX_LOGIC(X) X
9344 #endif /* defined(SQLITE_MUTEX_OMIT) */
9345
9346 /************** End of mutex.h ***********************************************/
9347 /************** Continuing where we left off in sqliteInt.h ******************/
9348
@@ -11754,19 +11770,21 @@
11770 # define sqlite3VtabInSync(db) 0
11771 # define sqlite3VtabLock(X)
11772 # define sqlite3VtabUnlock(X)
11773 # define sqlite3VtabUnlockList(X)
11774 # define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK
11775 # define sqlite3GetVTable(X,Y) ((VTable*)0)
11776 #else
11777 SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table*);
11778 SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, char **);
11779 SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db);
11780 SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db);
11781 SQLITE_PRIVATE void sqlite3VtabLock(VTable *);
11782 SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *);
11783 SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*);
11784 SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int);
11785 SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*);
11786 # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
11787 #endif
11788 SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*);
11789 SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*);
11790 SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*);
@@ -11782,11 +11800,10 @@
11800 SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
11801 SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*);
11802 SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
11803 SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
11804 SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*);
 
11805 SQLITE_PRIVATE const char *sqlite3JournalModename(int);
11806 SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int, int, int*, int*);
11807 SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int);
11808
11809 /* Declarations for functions in fkey.c. All of these are replaced by
@@ -13558,16 +13575,22 @@
13575 }
13576 return 0;
13577 }
13578
13579 /*
13580 ** Set the time to the current time reported by the VFS.
13581 **
13582 ** Return the number of errors.
13583 */
13584 static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
13585 sqlite3 *db = sqlite3_context_db_handle(context);
13586 if( sqlite3OsCurrentTimeInt64(db->pVfs, &p->iJD)==SQLITE_OK ){
13587 p->validJD = 1;
13588 return 0;
13589 }else{
13590 return 1;
13591 }
13592 }
13593
13594 /*
13595 ** Attempt to parse the given string into a Julian Day Number. Return
13596 ** the number of errors.
@@ -13593,12 +13616,11 @@
13616 if( parseYyyyMmDd(zDate,p)==0 ){
13617 return 0;
13618 }else if( parseHhMmSs(zDate, p)==0 ){
13619 return 0;
13620 }else if( sqlite3StrICmp(zDate,"now")==0){
13621 return setDateTimeToCurrent(context, p);
 
13622 }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){
13623 p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5);
13624 p->validJD = 1;
13625 return 0;
13626 }
@@ -14021,12 +14043,13 @@
14043 int i;
14044 const unsigned char *z;
14045 int eType;
14046 memset(p, 0, sizeof(*p));
14047 if( argc==0 ){
14048 return setDateTimeToCurrent(context, p);
14049 }
14050 if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
14051 || eType==SQLITE_INTEGER ){
14052 p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5);
14053 p->validJD = 1;
14054 }else{
14055 z = sqlite3_value_text(argv[0]);
@@ -14334,35 +14357,32 @@
14357 ){
14358 time_t t;
14359 char *zFormat = (char *)sqlite3_user_data(context);
14360 sqlite3 *db;
14361 sqlite3_int64 iT;
14362 struct tm *pTm;
14363 struct tm sNow;
14364 char zBuf[20];
14365
14366 UNUSED_PARAMETER(argc);
14367 UNUSED_PARAMETER(argv);
14368
14369 db = sqlite3_context_db_handle(context);
14370 if( sqlite3OsCurrentTimeInt64(db->pVfs, &iT) ) return;
14371 t = iT/1000 - 10000*(sqlite3_int64)21086676;
14372 #ifdef HAVE_GMTIME_R
14373 pTm = gmtime_r(&t, &sNow);
14374 #else
14375 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14376 pTm = gmtime(&t);
14377 if( pTm ) memcpy(&sNow, pTm, sizeof(sNow));
14378 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14379 #endif
14380 if( pTm ){
14381 strftime(zBuf, 20, zFormat, &sNow);
14382 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
14383 }
 
 
 
 
 
 
 
 
 
 
14384 }
14385 #endif
14386
14387 /*
14388 ** This function registered all of the above C functions as SQL
@@ -14693,16 +14713,16 @@
14713 ** Register a VFS with the system. It is harmless to register the same
14714 ** VFS multiple times. The new VFS becomes the default if makeDflt is
14715 ** true.
14716 */
14717 SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){
14718 MUTEX_LOGIC(sqlite3_mutex *mutex;)
14719 #ifndef SQLITE_OMIT_AUTOINIT
14720 int rc = sqlite3_initialize();
14721 if( rc ) return rc;
14722 #endif
14723 MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
14724 sqlite3_mutex_enter(mutex);
14725 vfsUnlink(pVfs);
14726 if( makeDflt || vfsList==0 ){
14727 pVfs->pNext = vfsList;
14728 vfsList = pVfs;
@@ -18946,52 +18966,14 @@
18966 ** an historical reference. Most of the "enhancements" have been backed
18967 ** out so that the functionality is now the same as standard printf().
18968 **
18969 **************************************************************************
18970 **
18971 ** This file contains code for a set of "printf"-like routines. These
18972 ** routines format strings much like the printf() from the standard C
18973 ** library, though the implementation here has enhancements to support
18974 ** SQLlite.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18975 */
18976
18977 /*
18978 ** Conversion types fall into various categories as defined by the
18979 ** following enumeration.
@@ -19125,43 +19107,19 @@
19107 }
19108 }
19109
19110 /*
19111 ** On machines with a small stack size, you can redefine the
19112 ** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired.
19113 */
19114 #ifndef SQLITE_PRINT_BUF_SIZE
19115 # define SQLITE_PRINT_BUF_SIZE 70
19116 #endif
19117 #define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */
19118
19119 /*
19120 ** Render a string given by "fmt" into the StrAccum object.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19121 */
19122 SQLITE_PRIVATE void sqlite3VXPrintf(
19123 StrAccum *pAccum, /* Accumulate results here */
19124 int useExtended, /* Allow extended %-conversions */
19125 const char *fmt, /* Format string */
@@ -19180,28 +19138,27 @@
19138 etByte flag_altform2; /* True if "!" flag is present */
19139 etByte flag_zeropad; /* True if field width constant starts with zero */
19140 etByte flag_long; /* True if "l" flag is present */
19141 etByte flag_longlong; /* True if the "ll" flag is present */
19142 etByte done; /* Loop termination flag */
19143 etByte xtype = 0; /* Conversion paradigm */
19144 char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
19145 sqlite_uint64 longvalue; /* Value for integer types */
19146 LONGDOUBLE_TYPE realvalue; /* Value for real types */
19147 const et_info *infop; /* Pointer to the appropriate info structure */
 
19148 char *zOut; /* Rendering buffer */
19149 int nOut; /* Size of the rendering buffer */
19150 char *zExtra; /* Malloced memory used by some conversion */
 
 
19151 #ifndef SQLITE_OMIT_FLOATING_POINT
19152 int exp, e2; /* exponent of real numbers */
19153 int nsd; /* Number of significant digits returned */
19154 double rounder; /* Used for rounding floating point values */
19155 etByte flag_dp; /* True if decimal point should be shown */
19156 etByte flag_rtz; /* True if trailing zeros should be removed */
 
19157 #endif
19158 char buf[etBUFSIZE]; /* Conversion buffer */
19159
 
19160 bufpt = 0;
19161 for(; (c=(*fmt))!=0; ++fmt){
19162 if( c!='%' ){
19163 int amt;
19164 bufpt = (char *)fmt;
@@ -19692,10 +19649,11 @@
19649 if( p->tooBig | p->mallocFailed ){
19650 testcase(p->tooBig);
19651 testcase(p->mallocFailed);
19652 return;
19653 }
19654 assert( p->zText!=0 || p->nChar==0 );
19655 if( N<0 ){
19656 N = sqlite3Strlen30(z);
19657 }
19658 if( N==0 || NEVER(z==0) ){
19659 return;
@@ -19723,19 +19681,20 @@
19681 zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc);
19682 }else{
19683 zNew = sqlite3_realloc(zOld, p->nAlloc);
19684 }
19685 if( zNew ){
19686 if( zOld==0 && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar);
19687 p->zText = zNew;
19688 }else{
19689 p->mallocFailed = 1;
19690 sqlite3StrAccumReset(p);
19691 return;
19692 }
19693 }
19694 }
19695 assert( p->zText );
19696 memcpy(&p->zText[p->nChar], z, N);
19697 p->nChar += N;
19698 }
19699
19700 /*
@@ -25172,11 +25131,11 @@
25131 return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
25132 }
25133 #endif
25134
25135
25136 #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
25137 /*
25138 ** Helper function for printing out trace information from debugging
25139 ** binaries. This returns the string represetation of the supplied
25140 ** integer lock-type.
25141 */
@@ -26007,18 +25966,18 @@
25966 ** locking a random byte from a range, concurrent SHARED locks may exist
25967 ** even if the locking primitive used is always a write-lock.
25968 */
25969 int rc = SQLITE_OK;
25970 unixFile *pFile = (unixFile*)id;
25971 unixInodeInfo *pInode;
25972 struct flock lock;
25973 int tErrno = 0;
25974
25975 assert( pFile );
25976 OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h,
25977 azFileLock(eFileLock), azFileLock(pFile->eFileLock),
25978 azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared , getpid()));
25979
25980 /* If there is already a lock of this type or more restrictive on the
25981 ** unixFile, do nothing. Don't use the end_lock: exit path, as
25982 ** unixEnterMutex() hasn't been called yet.
25983 */
@@ -26218,11 +26177,10 @@
26177 static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
26178 unixFile *pFile = (unixFile*)id;
26179 unixInodeInfo *pInode;
26180 struct flock lock;
26181 int rc = SQLITE_OK;
 
26182
26183 assert( pFile );
26184 OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock,
26185 pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared,
26186 getpid()));
@@ -26230,18 +26188,14 @@
26188 assert( eFileLock<=SHARED_LOCK );
26189 if( pFile->eFileLock<=eFileLock ){
26190 return SQLITE_OK;
26191 }
26192 unixEnterMutex();
 
26193 pInode = pFile->pInode;
26194 assert( pInode->nShared!=0 );
26195 if( pFile->eFileLock>SHARED_LOCK ){
26196 assert( pInode->eFileLock==pFile->eFileLock );
 
 
 
26197
26198 #ifndef NDEBUG
26199 /* When reducing a lock such that other processes can start
26200 ** reading the database file again, make sure that the
26201 ** transaction counter was updated if any part of the database
@@ -26248,15 +26202,10 @@
26202 ** file changed. If the transaction counter is not updated,
26203 ** other connections to the same file might not realize that
26204 ** the file has changed and hence might not know to flush their
26205 ** cache. The use of a stale cache can lead to database corruption.
26206 */
 
 
 
 
 
26207 pFile->inNormalWrite = 0;
26208 #endif
26209
26210 /* downgrading to a shared lock on NFS involves clearing the write lock
26211 ** before establishing the readlock - to avoid a race condition we downgrade
@@ -26354,13 +26303,10 @@
26303 pInode->nShared--;
26304 if( pInode->nShared==0 ){
26305 lock.l_type = F_UNLCK;
26306 lock.l_whence = SEEK_SET;
26307 lock.l_start = lock.l_len = 0L;
 
 
 
26308 if( unixFileLock(pFile, &lock)==0 ){
26309 pInode->eFileLock = NO_LOCK;
26310 }else{
26311 rc = SQLITE_IOERR_UNLOCK;
26312 pFile->lastErrno = errno;
@@ -29191,10 +29137,13 @@
29137 assert( zFilename==0 || zFilename[0]=='/'
29138 || pVfs->pAppData==(void*)&autolockIoFinder );
29139 #else
29140 assert( zFilename==0 || zFilename[0]=='/' );
29141 #endif
29142
29143 /* No locking occurs in temporary files */
29144 assert( zFilename!=0 || noLock );
29145
29146 OSTRACE(("OPEN %-3d %s\n", h, zFilename));
29147 pNew->h = h;
29148 pNew->zPath = zFilename;
29149 if( memcmp(pVfs->zName,"unix-excl",10)==0 ){
@@ -29293,10 +29242,11 @@
29242 /* Dotfile locking uses the file path so it needs to be included in
29243 ** the dotlockLockingContext
29244 */
29245 char *zLockFile;
29246 int nFilename;
29247 assert( zFilename!=0 );
29248 nFilename = (int)strlen(zFilename) + 6;
29249 zLockFile = (char *)sqlite3_malloc(nFilename);
29250 if( zLockFile==0 ){
29251 rc = SQLITE_NOMEM;
29252 }else{
@@ -30072,14 +30022,16 @@
30022 ** the current time and date as a Julian Day number times 86_400_000. In
30023 ** other words, write into *piNow the number of milliseconds since the Julian
30024 ** epoch of noon in Greenwich on November 24, 4714 B.C according to the
30025 ** proleptic Gregorian calendar.
30026 **
30027 ** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date
30028 ** cannot be found.
30029 */
30030 static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){
30031 static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
30032 int rc = SQLITE_OK;
30033 #if defined(NO_GETTOD)
30034 time_t t;
30035 time(&t);
30036 *piNow = ((sqlite3_int64)t)*1000 + unixEpoch;
30037 #elif OS_VXWORKS
@@ -30086,34 +30038,38 @@
30038 struct timespec sNow;
30039 clock_gettime(CLOCK_REALTIME, &sNow);
30040 *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000;
30041 #else
30042 struct timeval sNow;
30043 if( gettimeofday(&sNow, 0)==0 ){
30044 *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000;
30045 }else{
30046 rc = SQLITE_ERROR;
30047 }
30048 #endif
30049
30050 #ifdef SQLITE_TEST
30051 if( sqlite3_current_time ){
30052 *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
30053 }
30054 #endif
30055 UNUSED_PARAMETER(NotUsed);
30056 return rc;
30057 }
30058
30059 /*
30060 ** Find the current time (in Universal Coordinated Time). Write the
30061 ** current time and date as a Julian Day number into *prNow and
30062 ** return 0. Return 1 if the time and date cannot be found.
30063 */
30064 static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){
30065 sqlite3_int64 i = 0;
30066 int rc;
30067 UNUSED_PARAMETER(NotUsed);
30068 rc = unixCurrentTimeInt64(0, &i);
30069 *prNow = i/86400000.0;
30070 return rc;
30071 }
30072
30073 /*
30074 ** We added the xGetLastError() method with the intention of providing
30075 ** better low-level error messages when operating-system problems come up
@@ -34612,11 +34568,11 @@
34568 }
34569 static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){
34570 UNUSED_PARAMETER(pVfs);
34571 getLastErrorMsg(nBuf, zBufOut);
34572 }
34573 static void (*winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol))(void){
34574 UNUSED_PARAMETER(pVfs);
34575 #if SQLITE_OS_WINCE
34576 /* The GetProcAddressA() routine is only available on wince. */
34577 return (void(*)(void))GetProcAddressA((HANDLE)pHandle, zSymbol);
34578 #else
@@ -34623,11 +34579,11 @@
34579 /* All other windows platforms expect GetProcAddress() to take
34580 ** an Ansi string regardless of the _UNICODE setting */
34581 return (void(*)(void))GetProcAddress((HANDLE)pHandle, zSymbol);
34582 #endif
34583 }
34584 static void winDlClose(sqlite3_vfs *pVfs, void *pHandle){
34585 UNUSED_PARAMETER(pVfs);
34586 FreeLibrary((HANDLE)pHandle);
34587 }
34588 #else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
34589 #define winDlOpen 0
@@ -34697,11 +34653,12 @@
34653 ** the current time and date as a Julian Day number times 86_400_000. In
34654 ** other words, write into *piNow the number of milliseconds since the Julian
34655 ** epoch of noon in Greenwich on November 24, 4714 B.C according to the
34656 ** proleptic Gregorian calendar.
34657 **
34658 ** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date
34659 ** cannot be found.
34660 */
34661 static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){
34662 /* FILETIME structure is a 64-bit value representing the number of
34663 100-nanosecond intervals since January 1, 1601 (= JD 2305813.5).
34664 */
@@ -34717,11 +34674,11 @@
34674 #if SQLITE_OS_WINCE
34675 SYSTEMTIME time;
34676 GetSystemTime(&time);
34677 /* if SystemTimeToFileTime() fails, it returns zero. */
34678 if (!SystemTimeToFileTime(&time,&ft)){
34679 return SQLITE_ERROR;
34680 }
34681 #else
34682 GetSystemTimeAsFileTime( &ft );
34683 #endif
34684
@@ -34733,19 +34690,19 @@
34690 if( sqlite3_current_time ){
34691 *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
34692 }
34693 #endif
34694 UNUSED_PARAMETER(pVfs);
34695 return SQLITE_OK;
34696 }
34697
34698 /*
34699 ** Find the current time (in Universal Coordinated Time). Write the
34700 ** current time and date as a Julian Day number into *prNow and
34701 ** return 0. Return 1 if the time and date cannot be found.
34702 */
34703 static int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){
34704 int rc;
34705 sqlite3_int64 i;
34706 rc = winCurrentTimeInt64(pVfs, &i);
34707 if( !rc ){
34708 *prNow = i/86400000.0;
@@ -40068,11 +40025,10 @@
40025 needPagerReset = 0;
40026 }
40027 rc = pager_playback_one_page(pPager,&pPager->journalOff,0,1,0);
40028 if( rc!=SQLITE_OK ){
40029 if( rc==SQLITE_DONE ){
 
40030 pPager->journalOff = szJ;
40031 break;
40032 }else if( rc==SQLITE_IOERR_SHORT_READ ){
40033 /* If the journal has been truncated, simply stop reading and
40034 ** processing the journal. This might happen if the journal was
@@ -40330,10 +40286,11 @@
40286 #if defined(SQLITE_DEBUG) || defined(SQLITE_CHECK_PAGES)
40287 PgHdr *p; /* For looping over pages */
40288 #endif
40289
40290 assert( pPager->pWal );
40291 assert( pList );
40292 #ifdef SQLITE_DEBUG
40293 /* Verify that the page list is in accending order */
40294 for(p=pList; p && p->pDirty; p=p->pDirty){
40295 assert( p->pgno < p->pDirty->pgno );
40296 }
@@ -46566,11 +46523,11 @@
46523 */
46524 if( iRead ){
46525 int sz;
46526 i64 iOffset;
46527 sz = pWal->hdr.szPage;
46528 sz = (sz&0xfe00) + ((sz&0x0001)<<16);
46529 testcase( sz<=32768 );
46530 testcase( sz>=65536 );
46531 iOffset = walFrameOffset(iRead, sz) + WAL_FRAME_HDRSIZE;
46532 *pInWal = 1;
46533 /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */
@@ -49879,21 +49836,23 @@
49836 */
49837 if( isMemdb==0 && isTempDb==0 ){
49838 if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){
49839 int nFullPathname = pVfs->mxPathname+1;
49840 char *zFullPathname = sqlite3Malloc(nFullPathname);
49841 MUTEX_LOGIC( sqlite3_mutex *mutexShared; )
49842 p->sharable = 1;
49843 if( !zFullPathname ){
49844 sqlite3_free(p);
49845 return SQLITE_NOMEM;
49846 }
49847 sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname);
49848 #if SQLITE_THREADSAFE
49849 mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN);
49850 sqlite3_mutex_enter(mutexOpen);
49851 mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
49852 sqlite3_mutex_enter(mutexShared);
49853 #endif
49854 for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){
49855 assert( pBt->nRef>0 );
49856 if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager))
49857 && sqlite3PagerVfs(pBt->pPager)==pVfs ){
49858 int iDb;
@@ -49995,13 +49954,13 @@
49954
49955 #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
49956 /* Add the new BtShared object to the linked list sharable BtShareds.
49957 */
49958 if( p->sharable ){
49959 MUTEX_LOGIC( sqlite3_mutex *mutexShared; )
49960 pBt->nRef = 1;
49961 MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);)
49962 if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){
49963 pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST);
49964 if( pBt->mutex==0 ){
49965 rc = SQLITE_NOMEM;
49966 db->mallocFailed = 0;
@@ -50079,16 +50038,16 @@
50038 ** true if the BtShared.nRef counter reaches zero and return
50039 ** false if it is still positive.
50040 */
50041 static int removeFromSharingList(BtShared *pBt){
50042 #ifndef SQLITE_OMIT_SHARED_CACHE
50043 MUTEX_LOGIC( sqlite3_mutex *pMaster; )
50044 BtShared *pList;
50045 int removed = 0;
50046
50047 assert( sqlite3_mutex_notheld(pBt->mutex) );
50048 MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
50049 sqlite3_mutex_enter(pMaster);
50050 pBt->nRef--;
50051 if( pBt->nRef<=0 ){
50052 if( GLOBAL(BtShared*,sqlite3SharedCacheList)==pBt ){
50053 GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt->pNext;
@@ -52698,11 +52657,10 @@
52657 }
52658 }
52659 if( c==0 ){
52660 if( pPage->intKey && !pPage->leaf ){
52661 lwr = idx;
 
52662 break;
52663 }else{
52664 *pRes = 0;
52665 rc = SQLITE_OK;
52666 goto moveto_finish;
@@ -52716,11 +52674,11 @@
52674 if( lwr>upr ){
52675 break;
52676 }
52677 pCur->aiIdx[pCur->iPage] = (u16)(idx = (lwr+upr)/2);
52678 }
52679 assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) );
52680 assert( pPage->isInit );
52681 if( pPage->leaf ){
52682 chldPg = 0;
52683 }else if( lwr>=pPage->nCell ){
52684 chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]);
@@ -52981,10 +52939,12 @@
52939 }
52940 if( rc ){
52941 pTrunk = 0;
52942 goto end_allocate_page;
52943 }
52944 assert( pTrunk!=0 );
52945 assert( pTrunk->aData!=0 );
52946
52947 k = get4byte(&pTrunk->aData[4]); /* # of leaves on this trunk page */
52948 if( k==0 && !searchList ){
52949 /* The trunk has no leaves and the list is not being searched.
52950 ** So extract the trunk page itself and use it as the newly
@@ -54108,17 +54068,19 @@
54068 ** This is safe because dropping a cell only overwrites the first
54069 ** four bytes of it, and this function does not need the first
54070 ** four bytes of the divider cell. So the pointer is safe to use
54071 ** later on.
54072 **
54073 ** But not if we are in secure-delete mode. In secure-delete mode,
54074 ** the dropCell() routine will overwrite the entire cell with zeroes.
54075 ** In this case, temporarily copy the cell into the aOvflSpace[]
54076 ** buffer. It will be copied out again as soon as the aSpace[] buffer
54077 ** is allocated. */
54078 if( pBt->secureDelete ){
54079 int iOff;
54080
54081 iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData);
54082 if( (iOff+szNew[i])>(int)pBt->usableSize ){
54083 rc = SQLITE_CORRUPT_BKPT;
54084 memset(apOld, 0, (i+1)*sizeof(MemPage*));
54085 goto balance_cleanup;
54086 }else{
@@ -54534,10 +54496,11 @@
54496 int isDivider = 0;
54497 while( i==iNextOld ){
54498 /* Cell i is the cell immediately following the last cell on old
54499 ** sibling page j. If the siblings are not leaf pages of an
54500 ** intkey b-tree, then cell i was a divider cell. */
54501 assert( j+1 < ArraySize(apCopy) );
54502 pOld = apCopy[++j];
54503 iNextOld = i + !leafData + pOld->nCell + pOld->nOverflow;
54504 if( pOld->nOverflow ){
54505 nOverflow = pOld->nOverflow;
54506 iOverflow = i + !leafData + pOld->aOvfl[0].idx;
@@ -56876,18 +56839,18 @@
56839 /*
56840 ** Release all resources associated with an sqlite3_backup* handle.
56841 */
56842 SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){
56843 sqlite3_backup **pp; /* Ptr to head of pagers backup list */
56844 MUTEX_LOGIC( sqlite3_mutex *mutex; ) /* Mutex to protect source database */
56845 int rc; /* Value to return */
56846
56847 /* Enter the mutexes */
56848 if( p==0 ) return SQLITE_OK;
56849 sqlite3_mutex_enter(p->pSrcDb->mutex);
56850 sqlite3BtreeEnter(p->pSrc);
56851 MUTEX_LOGIC( mutex = p->pSrcDb->mutex; )
56852 if( p->pDestDb ){
56853 sqlite3_mutex_enter(p->pDestDb->mutex);
56854 }
56855
56856 /* Detach this backup from the source pager. */
@@ -58983,34 +58946,33 @@
58946 ** Change the comment on the the most recently coded instruction. Or
58947 ** insert a No-op and add the comment to that new instruction. This
58948 ** makes the code easier to read during debugging. None of this happens
58949 ** in a production build.
58950 */
58951 static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){
 
 
58952 assert( p->nOp>0 || p->aOp==0 );
58953 assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed );
58954 if( p->nOp ){
58955 assert( p->aOp );
58956 sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment);
58957 p->aOp[p->nOp-1].zComment = sqlite3VMPrintf(p->db, zFormat, ap);
58958 }
58959 }
58960 SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){
58961 va_list ap;
58962 if( p ){
58963 va_start(ap, zFormat);
58964 vdbeVComment(p, zFormat, ap);
 
58965 va_end(ap);
58966 }
58967 }
58968 SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){
58969 va_list ap;
58970 if( p ){
58971 sqlite3VdbeAddOp0(p, OP_Noop);
 
 
 
 
58972 va_start(ap, zFormat);
58973 vdbeVComment(p, zFormat, ap);
 
58974 va_end(ap);
58975 }
58976 }
58977 #endif /* NDEBUG */
58978
@@ -61266,11 +61228,11 @@
61228 ** than 2GiB are support - anything large must be database corruption.
61229 ** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so
61230 ** this code can safely assume that nCellKey is 32-bits
61231 */
61232 assert( sqlite3BtreeCursorIsValid(pCur) );
61233 VVA_ONLY(rc =) sqlite3BtreeKeySize(pCur, &nCellKey);
61234 assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
61235 assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey );
61236
61237 /* Read in the complete content of the index entry */
61238 memset(&m, 0, sizeof(m));
@@ -61341,11 +61303,11 @@
61303 int rc;
61304 BtCursor *pCur = pC->pCursor;
61305 Mem m;
61306
61307 assert( sqlite3BtreeCursorIsValid(pCur) );
61308 VVA_ONLY(rc =) sqlite3BtreeKeySize(pCur, &nCellKey);
61309 assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
61310 /* nCellKey will always be between 0 and 0xffffffff because of the say
61311 ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */
61312 if( nCellKey<=0 || nCellKey>0x7fffffff ){
61313 *res = 0;
@@ -65617,20 +65579,20 @@
65579 }else if( u.am.pC->cacheStatus==p->cacheCtr ){
65580 u.am.payloadSize = u.am.pC->payloadSize;
65581 u.am.zRec = (char*)u.am.pC->aRow;
65582 }else if( u.am.pC->isIndex ){
65583 assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) );
65584 VVA_ONLY(rc =) sqlite3BtreeKeySize(u.am.pCrsr, &u.am.payloadSize64);
65585 assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
65586 /* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the
65587 ** payload size, so it is impossible for u.am.payloadSize64 to be
65588 ** larger than 32 bits. */
65589 assert( (u.am.payloadSize64 & SQLITE_MAX_U32)==(u64)u.am.payloadSize64 );
65590 u.am.payloadSize = (u32)u.am.payloadSize64;
65591 }else{
65592 assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) );
65593 VVA_ONLY(rc =) sqlite3BtreeDataSize(u.am.pCrsr, &u.am.payloadSize);
65594 assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
65595 }
65596 }else if( ALWAYS(u.am.pC->pseudoTableReg>0) ){
65597 u.am.pReg = &aMem[u.am.pC->pseudoTableReg];
65598 assert( u.am.pReg->flags & MEM_Blob );
@@ -67678,18 +67640,18 @@
67640 rc = sqlite3VdbeCursorMoveto(u.bk.pC);
67641 if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
67642
67643 if( u.bk.pC->isIndex ){
67644 assert( !u.bk.pC->isTable );
67645 VVA_ONLY(rc =) sqlite3BtreeKeySize(u.bk.pCrsr, &u.bk.n64);
67646 assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
67647 if( u.bk.n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){
67648 goto too_big;
67649 }
67650 u.bk.n = (u32)u.bk.n64;
67651 }else{
67652 VVA_ONLY(rc =) sqlite3BtreeDataSize(u.bk.pCrsr, &u.bk.n);
67653 assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
67654 if( u.bk.n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
67655 goto too_big;
67656 }
67657 }
@@ -73322,11 +73284,12 @@
73284 pNew->flags |= EP_IntValue;
73285 pNew->u.iValue = iValue;
73286 }else{
73287 int c;
73288 pNew->u.zToken = (char*)&pNew[1];
73289 assert( pToken->z!=0 || pToken->n==0 );
73290 if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n);
73291 pNew->u.zToken[pToken->n] = 0;
73292 if( dequote && nExtra>=3
73293 && ((c = pToken->z[0])=='\'' || c=='"' || c=='[' || c=='`') ){
73294 sqlite3Dequote(pNew->u.zToken);
73295 if( c=='"' ) pNew->flags |= EP_DblQuoted;
@@ -74361,15 +74324,23 @@
74324 ** ephemeral table.
74325 */
74326 p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0);
74327 if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){
74328 sqlite3 *db = pParse->db; /* Database connection */
 
 
74329 Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */
74330 Table *pTab; /* Table <table>. */
74331 Expr *pExpr; /* Expression <column> */
74332 int iCol; /* Index of column <column> */
74333 int iDb; /* Database idx for pTab */
74334
74335 assert( p ); /* Because of isCandidateForInOpt(p) */
74336 assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */
74337 assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */
74338 assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */
74339 pTab = p->pSrc->a[0].pTab;
74340 pExpr = p->pEList->a[0].pExpr;
74341 iCol = pExpr->iColumn;
74342
74343 /* Code an OP_VerifyCookie and OP_TableLock for <table>. */
74344 iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
74345 sqlite3CodeVerifySchema(pParse, iDb);
74346 sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
@@ -76372,11 +76343,11 @@
76343 if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){
76344 return 2;
76345 }
76346 }else if( pA->op!=TK_COLUMN && pA->u.zToken ){
76347 if( ExprHasProperty(pB, EP_IntValue) || NEVER(pB->u.zToken==0) ) return 2;
76348 if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){
76349 return 2;
76350 }
76351 }
76352 if( (pA->flags & EP_ExpCollate)!=(pB->flags & EP_ExpCollate) ) return 1;
76353 if( (pA->flags & EP_ExpCollate)!=0 && pA->pColl!=pB->pColl ) return 2;
@@ -81778,17 +81749,19 @@
81749 */
81750 static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
81751 Table *pTab = pIndex->pTable; /* The table that is indexed */
81752 int iTab = pParse->nTab++; /* Btree cursor used for pTab */
81753 int iIdx = pParse->nTab++; /* Btree cursor used for pIndex */
81754 int iSorter; /* Cursor opened by OpenSorter (if in use) */
81755 int addr1; /* Address of top of loop */
81756 int addr2; /* Address to jump to for next iteration */
81757 int tnum; /* Root page of index */
81758 Vdbe *v; /* Generate code into this virtual machine */
81759 KeyInfo *pKey; /* KeyInfo for index */
81760 #ifdef SQLITE_OMIT_MERGE_SORT
81761 int regIdxKey; /* Registers containing the index key */
81762 #endif
81763 int regRecord; /* Register holding assemblied index record */
81764 sqlite3 *db = pParse->db; /* The database connection */
81765 int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
81766
81767 #ifndef SQLITE_OMIT_AUTHORIZATION
@@ -81818,21 +81791,22 @@
81791
81792 #ifndef SQLITE_OMIT_MERGE_SORT
81793 /* Open the sorter cursor if we are to use one. */
81794 iSorter = pParse->nTab++;
81795 sqlite3VdbeAddOp4(v, OP_SorterOpen, iSorter, 0, 0, (char*)pKey, P4_KEYINFO);
81796 #else
81797 iSorter = iTab;
81798 #endif
81799
81800 /* Open the table. Loop through all rows of the table, inserting index
81801 ** records into the sorter. */
81802 sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
81803 addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0);
 
81804 regRecord = sqlite3GetTempReg(pParse);
 
81805
81806 #ifndef SQLITE_OMIT_MERGE_SORT
81807 sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
81808 sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord);
81809 sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1);
81810 sqlite3VdbeJumpHere(v, addr1);
81811 addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0);
81812 if( pIndex->onError!=OE_None ){
@@ -81848,10 +81822,12 @@
81822 }
81823 sqlite3VdbeAddOp2(v, OP_SorterData, iSorter, regRecord);
81824 sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 1);
81825 sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
81826 #else
81827 regIdxKey = sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
81828 addr2 = addr1 + 1;
81829 if( pIndex->onError!=OE_None ){
81830 const int regRowid = regIdxKey + pIndex->nColumn;
81831 const int j2 = sqlite3VdbeCurrentAddr(v) + 2;
81832 void * const pRegKey = SQLITE_INT_TO_PTR(regIdxKey);
81833
@@ -81945,10 +81921,11 @@
81921 ** before looking up the table.
81922 */
81923 assert( pName1 && pName2 );
81924 iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
81925 if( iDb<0 ) goto exit_create_index;
81926 assert( pName && pName->z );
81927
81928 #ifndef SQLITE_OMIT_TEMPDB
81929 /* If the index name was unqualified, check if the the table
81930 ** is a temp table. If so, set the database to 1. Do not do this
81931 ** if initialising a database schema.
@@ -81972,10 +81949,11 @@
81949 pTblName->a[0].zDatabase);
81950 if( !pTab || db->mallocFailed ) goto exit_create_index;
81951 assert( db->aDb[iDb].pSchema==pTab->pSchema );
81952 }else{
81953 assert( pName==0 );
81954 assert( pStart==0 );
81955 pTab = pParse->pNewTable;
81956 if( !pTab ) goto exit_create_index;
81957 iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
81958 }
81959 pDb = &db->aDb[iDb];
@@ -82014,10 +81992,11 @@
81992 ** own name.
81993 */
81994 if( pName ){
81995 zName = sqlite3NameFromToken(db, pName);
81996 if( zName==0 ) goto exit_create_index;
81997 assert( pName->z!=0 );
81998 if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
81999 goto exit_create_index;
82000 }
82001 if( !db->init.busy ){
82002 if( sqlite3FindTable(db, zName, 0)!=0 ){
@@ -82869,17 +82848,14 @@
82848
82849 /*
82850 ** Commit a transaction
82851 */
82852 SQLITE_PRIVATE void sqlite3CommitTransaction(Parse *pParse){
 
82853 Vdbe *v;
82854
82855 assert( pParse!=0 );
82856 assert( pParse->db!=0 );
 
 
82857 if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ){
82858 return;
82859 }
82860 v = sqlite3GetVdbe(pParse);
82861 if( v ){
@@ -82889,17 +82865,14 @@
82865
82866 /*
82867 ** Rollback a transaction
82868 */
82869 SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse *pParse){
 
82870 Vdbe *v;
82871
82872 assert( pParse!=0 );
82873 assert( pParse->db!=0 );
 
 
82874 if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ){
82875 return;
82876 }
82877 v = sqlite3GetVdbe(pParse);
82878 if( v ){
@@ -84701,20 +84674,19 @@
84674 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
84675 assert( z2==(char*)sqlite3_value_text(argv[0]) );
84676 if( z2 ){
84677 z1 = contextMalloc(context, ((i64)n)+1);
84678 if( z1 ){
84679 for(i=0; i<n; i++){
84680 z1[i] = (char)sqlite3Toupper(z2[i]);
 
84681 }
84682 sqlite3_result_text(context, z1, n, sqlite3_free);
84683 }
84684 }
84685 }
84686 static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
84687 char *z1;
84688 const char *z2;
84689 int i, n;
84690 UNUSED_PARAMETER(argc);
84691 z2 = (char*)sqlite3_value_text(argv[0]);
84692 n = sqlite3_value_bytes(argv[0]);
@@ -84721,15 +84693,14 @@
84693 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
84694 assert( z2==(char*)sqlite3_value_text(argv[0]) );
84695 if( z2 ){
84696 z1 = contextMalloc(context, ((i64)n)+1);
84697 if( z1 ){
84698 for(i=0; i<n; i++){
84699 z1[i] = sqlite3Tolower(z2[i]);
 
84700 }
84701 sqlite3_result_text(context, z1, n, sqlite3_free);
84702 }
84703 }
84704 }
84705
84706
@@ -87102,10 +87073,11 @@
87073 sqlite3SelectDelete(db, pSelect);
87074 if( db->mallocFailed==1 ){
87075 fkTriggerDelete(db, pTrigger);
87076 return 0;
87077 }
87078 assert( pStep!=0 );
87079
87080 switch( action ){
87081 case OE_Restrict:
87082 pStep->op = TK_SELECT;
87083 break;
@@ -90025,11 +89997,11 @@
89997 sqlite3_vfs *pVfs = db->pVfs;
89998 void *handle;
89999 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
90000 char *zErrmsg = 0;
90001 void **aHandle;
90002 int nMsg = 300 + sqlite3Strlen30(zFile);
90003
90004 if( pzErrMsg ) *pzErrMsg = 0;
90005
90006 /* Ticket #1863. To avoid a creating security problems for older
90007 ** applications that relink against newer versions of SQLite, the
@@ -90062,10 +90034,11 @@
90034 }
90035 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*))
90036 sqlite3OsDlSym(pVfs, handle, zProc);
90037 if( xInit==0 ){
90038 if( pzErrMsg ){
90039 nMsg += sqlite3Strlen30(zProc);
90040 *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg);
90041 if( zErrmsg ){
90042 sqlite3_snprintf(nMsg, zErrmsg,
90043 "no entry point [%s] in shared library [%s]", zProc,zFile);
90044 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
@@ -90747,11 +90720,11 @@
90720 ){
90721 int iReg;
90722 if( sqlite3ReadSchema(pParse) ) goto pragma_out;
90723 sqlite3CodeVerifySchema(pParse, iDb);
90724 iReg = ++pParse->nMem;
90725 if( sqlite3Tolower(zLeft[0])=='p' ){
90726 sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg);
90727 }else{
90728 sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, sqlite3Atoi(zRight));
90729 }
90730 sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1);
@@ -91360,11 +91333,11 @@
91333 { OP_IfNeg, 1, 0, 0}, /* 1 */
91334 { OP_String8, 0, 3, 0}, /* 2 */
91335 { OP_ResultRow, 3, 1, 0},
91336 };
91337
91338 int isQuick = (sqlite3Tolower(zLeft[0])=='q');
91339
91340 /* Initialize the VDBE program */
91341 if( sqlite3ReadSchema(pParse) ) goto pragma_out;
91342 pParse->nMem = 6;
91343 sqlite3VdbeSetNumCols(v, 1);
@@ -93942,11 +93915,14 @@
93915 /* If the column contains an "AS <name>" phrase, use <name> as the name */
93916 zName = sqlite3DbStrDup(db, zName);
93917 }else{
93918 Expr *pColExpr = p; /* The expression that is the result column name */
93919 Table *pTab; /* Table associated with this expression */
93920 while( pColExpr->op==TK_DOT ){
93921 pColExpr = pColExpr->pRight;
93922 assert( pColExpr!=0 );
93923 }
93924 if( pColExpr->op==TK_COLUMN && ALWAYS(pColExpr->pTab!=0) ){
93925 /* For columns use the column name name */
93926 int iCol = pColExpr->iColumn;
93927 pTab = pColExpr->pTab;
93928 if( iCol<0 ) iCol = pTab->iPKey;
@@ -98940,10 +98916,11 @@
98916 break;
98917 }
98918 }
98919 }
98920 for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
98921 assert( aRegIdx );
98922 if( openAll || aRegIdx[i]>0 ){
98923 KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx);
98924 sqlite3VdbeAddOp4(v, OP_OpenWrite, iCur+i+1, pIdx->tnum, iDb,
98925 (char*)pKey, P4_KEYINFO_HANDOFF);
98926 assert( pParse->nTab>iCur+i+1 );
@@ -99113,10 +99090,11 @@
99090 sqlite3VdbeAddOp2(v, OP_Goto, 0, addr);
99091 sqlite3VdbeJumpHere(v, addr);
99092
99093 /* Close all tables */
99094 for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
99095 assert( aRegIdx );
99096 if( openAll || aRegIdx[i]>0 ){
99097 sqlite3VdbeAddOp2(v, OP_Close, iCur+i+1, 0);
99098 }
99099 }
99100 sqlite3VdbeAddOp2(v, OP_Close, iCur, 0);
@@ -103144,11 +103122,10 @@
103122 assert( roundUp==0 || roundUp==1 );
103123 assert( pIdx->nSample>0 );
103124 if( pVal==0 ) return SQLITE_ERROR;
103125 n = pIdx->aiRowEst[0];
103126 aSample = pIdx->aSample;
 
103127 eType = sqlite3_value_type(pVal);
103128
103129 if( eType==SQLITE_INTEGER ){
103130 v = sqlite3_value_int64(pVal);
103131 r = (i64)v;
@@ -105564,11 +105541,12 @@
105541 assert( bestJ>=0 );
105542 assert( notReady & getMask(pMaskSet, pTabList->a[bestJ].iCursor) );
105543 WHERETRACE(("*** Optimizer selects table %d for loop %d"
105544 " with cost=%g and nRow=%g\n",
105545 bestJ, pLevel-pWInfo->a, bestPlan.rCost, bestPlan.plan.nRow));
105546 /* The ALWAYS() that follows was added to hush up clang scan-build */
105547 if( (bestPlan.plan.wsFlags & WHERE_ORDERBY)!=0 && ALWAYS(ppOrderBy) ){
105548 *ppOrderBy = 0;
105549 }
105550 if( (bestPlan.plan.wsFlags & WHERE_DISTINCT)!=0 ){
105551 assert( pWInfo->eDistinct==0 );
105552 pWInfo->eDistinct = WHERE_DISTINCT_ORDERED;
@@ -109180,11 +109158,13 @@
109158 sqlite3ParserTOKENTYPE yyminor /* The value for the token */
109159 sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */
109160 ){
109161 YYMINORTYPE yyminorunion;
109162 int yyact; /* The parser action. */
109163 #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
109164 int yyendofinput; /* True if we are at the end of input */
109165 #endif
109166 #ifdef YYERRORSYMBOL
109167 int yyerrorhit = 0; /* True if yymajor has invoked an error */
109168 #endif
109169 yyParser *yypParser; /* The parser */
109170
@@ -109203,11 +109183,13 @@
109183 yypParser->yyerrcnt = -1;
109184 yypParser->yystack[0].stateno = 0;
109185 yypParser->yystack[0].major = 0;
109186 }
109187 yyminorunion.yy0 = yyminor;
109188 #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
109189 yyendofinput = (yymajor==0);
109190 #endif
109191 sqlite3ParserARG_STORE;
109192
109193 #ifndef NDEBUG
109194 if( yyTraceFILE ){
109195 fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]);
@@ -109215,11 +109197,10 @@
109197 #endif
109198
109199 do{
109200 yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
109201 if( yyact<YYNSTATE ){
 
109202 yy_shift(yypParser,yyact,yymajor,&yyminorunion);
109203 yypParser->yyerrcnt--;
109204 yymajor = YYNOCODE;
109205 }else if( yyact < YYNSTATE + YYNRULE ){
109206 yy_reduce(yypParser,yyact-YYNSTATE);
@@ -110607,11 +110588,11 @@
110588 **
110589 ** * Recursive calls to this routine from thread X return immediately
110590 ** without blocking.
110591 */
110592 SQLITE_API int sqlite3_initialize(void){
110593 MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */
110594 int rc; /* Result code */
110595
110596 #ifdef SQLITE_OMIT_WSD
110597 rc = sqlite3_wsd_init(4096, 24);
110598 if( rc!=SQLITE_OK ){
@@ -110641,11 +110622,11 @@
110622 ** This operation is protected by the STATIC_MASTER mutex. Note that
110623 ** MutexAlloc() is called for a static mutex prior to initializing the
110624 ** malloc subsystem - this implies that the allocation of a static
110625 ** mutex must not require support from the malloc subsystem.
110626 */
110627 MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
110628 sqlite3_mutex_enter(pMaster);
110629 sqlite3GlobalConfig.isMutexInit = 1;
110630 if( !sqlite3GlobalConfig.isMallocInit ){
110631 rc = sqlite3MallocInit();
110632 }
@@ -111715,17 +111696,17 @@
111696 sqlite3 *db,
111697 const char *zName,
111698 int nArg
111699 ){
111700 int nName = sqlite3Strlen30(zName);
111701 int rc = SQLITE_OK;
111702 sqlite3_mutex_enter(db->mutex);
111703 if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){
111704 rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
111705 0, sqlite3InvalidFunction, 0, 0, 0);
111706 }
111707 rc = sqlite3ApiExit(db, rc);
111708 sqlite3_mutex_leave(db->mutex);
111709 return rc;
111710 }
111711
111712 #ifndef SQLITE_OMIT_TRACE
@@ -112783,10 +112764,11 @@
112764 if( db ){
112765 assert( db->mutex!=0 || isThreadsafe==0 || sqlite3GlobalConfig.bFullMutex==0 );
112766 sqlite3_mutex_leave(db->mutex);
112767 }
112768 rc = sqlite3_errcode(db);
112769 assert( db!=0 || rc==SQLITE_NOMEM );
112770 if( rc==SQLITE_NOMEM ){
112771 sqlite3_close(db);
112772 db = 0;
112773 }else if( rc!=SQLITE_OK ){
112774 db->magic = SQLITE_MAGIC_SICK;
@@ -114511,10 +114493,17 @@
114493 #else
114494 # define TESTONLY(X)
114495 #endif
114496
114497 #endif /* SQLITE_AMALGAMATION */
114498
114499 #ifdef SQLITE_DEBUG
114500 SQLITE_PRIVATE int sqlite3Fts3Corrupt(void);
114501 # define FTS_CORRUPT_VTAB sqlite3Fts3Corrupt()
114502 #else
114503 # define FTS_CORRUPT_VTAB SQLITE_CORRUPT_VTAB
114504 #endif
114505
114506 typedef struct Fts3Table Fts3Table;
114507 typedef struct Fts3Cursor Fts3Cursor;
114508 typedef struct Fts3Expr Fts3Expr;
114509 typedef struct Fts3Phrase Fts3Phrase;
@@ -115012,11 +115001,11 @@
115001 char **pp,
115002 char *pStart,
115003 sqlite3_int64 *pVal
115004 ){
115005 sqlite3_int64 iVal;
115006 char *p;
115007
115008 /* Pointer p now points at the first byte past the varint we are
115009 ** interested in. So, unless the doclist is corrupt, the 0x80 bit is
115010 ** clear on character p[-1]. */
115011 for(p = (*pp)-2; p>=pStart && *p&0x80; p--);
@@ -115413,11 +115402,11 @@
115402 ** the output value undefined. Otherwise SQLITE_OK is returned.
115403 **
115404 ** This function is used when parsing the "prefix=" FTS4 parameter.
115405 */
115406 static int fts3GobbleInt(const char **pp, int *pnOut){
115407 const char *p; /* Iterator pointer */
115408 int nInt = 0; /* Output value */
115409
115410 for(p=*pp; p[0]>='0' && p[0]<='9'; p++){
115411 nInt = nInt * 10 + (p[0] - '0');
115412 }
@@ -115912,11 +115901,11 @@
115901 if( rc==SQLITE_OK ){
115902 /* If no row was found and no error has occured, then the %_content
115903 ** table is missing a row that is present in the full-text index.
115904 ** The data structures are corrupt.
115905 */
115906 rc = FTS_CORRUPT_VTAB;
115907 }
115908 pCsr->isEof = 1;
115909 if( pContext ){
115910 sqlite3_result_error_code(pContext, rc);
115911 }
@@ -115972,11 +115961,11 @@
115961 ** nNode bytes of content (see sqlite3Fts3ReadBlock() for details).
115962 */
115963 zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
115964 zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
115965 if( zCsr>zEnd ){
115966 return FTS_CORRUPT_VTAB;
115967 }
115968
115969 while( zCsr<zEnd && (piFirst || piLast) ){
115970 int cmp; /* memcmp() result */
115971 int nSuffix; /* Size of term suffix */
@@ -115990,11 +115979,11 @@
115979 }
115980 isFirstTerm = 0;
115981 zCsr += sqlite3Fts3GetVarint32(zCsr, &nSuffix);
115982
115983 if( nPrefix<0 || nSuffix<0 || &zCsr[nSuffix]>zEnd ){
115984 rc = FTS_CORRUPT_VTAB;
115985 goto finish_scan;
115986 }
115987 if( nPrefix+nSuffix>nAlloc ){
115988 char *zNew;
115989 nAlloc = (nPrefix+nSuffix) * 2;
@@ -116003,10 +115992,11 @@
115992 rc = SQLITE_NOMEM;
115993 goto finish_scan;
115994 }
115995 zBuffer = zNew;
115996 }
115997 assert( zBuffer );
115998 memcpy(&zBuffer[nPrefix], zCsr, nSuffix);
115999 nBuffer = nPrefix + nSuffix;
116000 zCsr += nSuffix;
116001
116002 /* Compare the term we are searching for with the term just loaded from
@@ -117439,11 +117429,11 @@
117429 ** moves *ppPoslist so that it instead points to the first byte of the
117430 ** same position list.
117431 */
117432 static void fts3ReversePoslist(char *pStart, char **ppPoslist){
117433 char *p = &(*ppPoslist)[-2];
117434 char c = 0;
117435
117436 while( p>pStart && (c=*p--)==0 );
117437 while( p>pStart && (*p & 0x80) | c ){
117438 c = *p--;
117439 }
@@ -118433,11 +118423,11 @@
118423 while( a<pEnd ){
118424 a += sqlite3Fts3GetVarint(a, &nByte);
118425 }
118426 if( nDoc==0 || nByte==0 ){
118427 sqlite3_reset(pStmt);
118428 return FTS_CORRUPT_VTAB;
118429 }
118430
118431 pCsr->nDoc = nDoc;
118432 pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz);
118433 assert( pCsr->nRowAvg>0 );
@@ -118909,12 +118899,15 @@
118899 }
118900
118901 aPoslist = pExpr->pRight->pPhrase->doclist.pList;
118902 nToken = pExpr->pRight->pPhrase->nToken;
118903 for(p=pExpr->pLeft; p && res; p=p->pLeft){
118904 int nNear;
118905 Fts3Phrase *pPhrase;
118906 assert( p->pParent && p->pParent->pLeft==p );
118907 nNear = p->pParent->nNear;
118908 pPhrase = (
118909 p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase
118910 );
118911 res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase);
118912 }
118913 }
@@ -119400,10 +119393,19 @@
119393 pPhrase->aToken[i].pSegcsr = 0;
119394 }
119395 }
119396 }
119397
119398 /*
119399 ** Return SQLITE_CORRUPT_VTAB.
119400 */
119401 #ifdef SQLITE_DEBUG
119402 SQLITE_PRIVATE int sqlite3Fts3Corrupt(){
119403 return SQLITE_CORRUPT_VTAB;
119404 }
119405 #endif
119406
119407 #if !SQLITE_CORE
119408 /*
119409 ** Initialize API pointer table, if required.
119410 */
119411 SQLITE_API int sqlite3_extension_init(
@@ -120197,12 +120199,16 @@
120199 p->pPhrase = (Fts3Phrase *)&p[1];
120200 p->pPhrase->iColumn = pParse->iDefaultCol;
120201 p->pPhrase->nToken = nToken;
120202
120203 zBuf = (char *)&p->pPhrase->aToken[nToken];
120204 if( zTemp ){
120205 memcpy(zBuf, zTemp, nTemp);
120206 sqlite3_free(zTemp);
120207 }else{
120208 assert( nTemp==0 );
120209 }
120210
120211 for(jj=0; jj<p->pPhrase->nToken; jj++){
120212 p->pPhrase->aToken[jj].z = zBuf;
120213 zBuf += p->pPhrase->aToken[jj].n;
120214 }
@@ -122957,11 +122963,11 @@
122963 sqlite3_bind_int64(pStmt, 1, iDocid);
122964 }
122965 rc = sqlite3_step(pStmt);
122966 if( rc!=SQLITE_ROW || sqlite3_column_type(pStmt, 0)!=SQLITE_BLOB ){
122967 rc = sqlite3_reset(pStmt);
122968 if( rc==SQLITE_OK ) rc = FTS_CORRUPT_VTAB;
122969 pStmt = 0;
122970 }else{
122971 rc = SQLITE_OK;
122972 }
122973 }
@@ -123761,11 +123767,11 @@
123767 pNext += sqlite3Fts3GetVarint32(pNext, &nPrefix);
123768 pNext += sqlite3Fts3GetVarint32(pNext, &nSuffix);
123769 if( nPrefix<0 || nSuffix<=0
123770 || &pNext[nSuffix]>&pReader->aNode[pReader->nNode]
123771 ){
123772 return FTS_CORRUPT_VTAB;
123773 }
123774
123775 if( nPrefix+nSuffix>pReader->nTermAlloc ){
123776 int nNew = (nPrefix+nSuffix)*2;
123777 char *zNew = sqlite3_realloc(pReader->zTerm, nNew);
@@ -123791,11 +123797,11 @@
123797 ** of these statements is untrue, then the data structure is corrupt.
123798 */
123799 if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode]
123800 || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1])
123801 ){
123802 return FTS_CORRUPT_VTAB;
123803 }
123804 return SQLITE_OK;
123805 }
123806
123807 /*
@@ -125745,11 +125751,10 @@
125751 sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */
125752 ){
125753 Fts3Table *p = (Fts3Table *)pVtab;
125754 int rc = SQLITE_OK; /* Return Code */
125755 int isRemove = 0; /* True for an UPDATE or DELETE */
 
125756 u32 *aSzIns = 0; /* Sizes of inserted documents */
125757 u32 *aSzDel; /* Sizes of deleted documents */
125758 int nChng = 0; /* Net change in number of documents */
125759 int bInsertDone = 0;
125760
@@ -125828,23 +125833,23 @@
125833 /* If this is a DELETE or UPDATE operation, remove the old record. */
125834 if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
125835 assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER );
125836 rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel);
125837 isRemove = 1;
 
125838 }
125839
125840 /* If this is an INSERT or UPDATE operation, insert the new record. */
125841 if( nArg>1 && rc==SQLITE_OK ){
125842 if( bInsertDone==0 ){
125843 rc = fts3InsertData(p, apVal, pRowid);
125844 if( rc==SQLITE_CONSTRAINT ) rc = FTS_CORRUPT_VTAB;
125845 }
125846 if( rc==SQLITE_OK && (!isRemove || *pRowid!=p->iPrevDocid ) ){
125847 rc = fts3PendingTermsDocid(p, *pRowid);
125848 }
125849 if( rc==SQLITE_OK ){
125850 assert( p->iPrevDocid==*pRowid );
125851 rc = fts3InsertTerms(p, apVal, aSzIns);
125852 }
125853 if( p->bHasDocsize ){
125854 fts3InsertDocsize(&rc, p, aSzIns);
125855 }
@@ -126734,11 +126739,11 @@
126739 pStmt = *ppStmt;
126740 assert( sqlite3_data_count(pStmt)==1 );
126741
126742 a = sqlite3_column_blob(pStmt, 0);
126743 a += sqlite3Fts3GetVarint(a, &nDoc);
126744 if( nDoc==0 ) return FTS_CORRUPT_VTAB;
126745 *pnDoc = (u32)nDoc;
126746
126747 if( paLen ) *paLen = a;
126748 return SQLITE_OK;
126749 }
@@ -127313,11 +127318,11 @@
127318 sqlite3_snprintf(sizeof(aBuffer), aBuffer,
127319 "%d %d %d %d ", iCol, pTerm-sCtx.aTerm, iStart, iEnd-iStart
127320 );
127321 rc = fts3StringAppend(&res, aBuffer, -1);
127322 }else if( rc==SQLITE_DONE ){
127323 rc = FTS_CORRUPT_VTAB;
127324 }
127325 }
127326 }
127327 if( rc==SQLITE_DONE ){
127328 rc = SQLITE_OK;
@@ -128654,11 +128659,12 @@
128659 pCsr->nConstraint = argc;
128660 if( !pCsr->aConstraint ){
128661 rc = SQLITE_NOMEM;
128662 }else{
128663 memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*argc);
128664 assert( (idxStr==0 && argc==0)
128665 || (idxStr && (int)strlen(idxStr)==argc*2) );
128666 for(ii=0; ii<argc; ii++){
128667 RtreeConstraint *p = &pCsr->aConstraint[ii];
128668 p->op = idxStr[ii*2];
128669 p->iCoord = idxStr[ii*2+1]-'a';
128670 if( p->op==RTREE_MATCH ){
@@ -128955,11 +128961,14 @@
128961 int iCell;
128962 sqlite3_int64 iBest = 0;
128963
128964 float fMinGrowth = 0.0;
128965 float fMinArea = 0.0;
128966 #if VARIANT_RSTARTREE_CHOOSESUBTREE
128967 float fMinOverlap = 0.0;
128968 float overlap;
128969 #endif
128970
128971 int nCell = NCELL(pNode);
128972 RtreeCell cell;
128973 RtreeNode *pChild;
128974
@@ -128987,33 +128996,34 @@
128996 */
128997 for(iCell=0; iCell<nCell; iCell++){
128998 int bBest = 0;
128999 float growth;
129000 float area;
 
129001 nodeGetCell(pRtree, pNode, iCell, &cell);
129002 growth = cellGrowth(pRtree, &cell, pCell);
129003 area = cellArea(pRtree, &cell);
129004
129005 #if VARIANT_RSTARTREE_CHOOSESUBTREE
129006 if( ii==(pRtree->iDepth-1) ){
129007 overlap = cellOverlapEnlargement(pRtree,&cell,pCell,aCell,nCell,iCell);
129008 }else{
129009 overlap = 0.0;
129010 }
129011 if( (iCell==0)
129012 || (overlap<fMinOverlap)
129013 || (overlap==fMinOverlap && growth<fMinGrowth)
129014 || (overlap==fMinOverlap && growth==fMinGrowth && area<fMinArea)
129015 ){
129016 bBest = 1;
129017 fMinOverlap = overlap;
129018 }
129019 #else
129020 if( iCell==0||growth<fMinGrowth||(growth==fMinGrowth && area<fMinArea) ){
129021 bBest = 1;
129022 }
129023 #endif
129024 if( bBest ){
 
129025 fMinGrowth = growth;
129026 fMinArea = area;
129027 iBest = cell.iRowid;
129028 }
129029 }
129030
+16 -3
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -107,11 +107,11 @@
107107
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
108108
** [sqlite_version()] and [sqlite_source_id()].
109109
*/
110110
#define SQLITE_VERSION "3.7.9"
111111
#define SQLITE_VERSION_NUMBER 3007009
112
-#define SQLITE_SOURCE_ID "2011-10-11 20:41:54 b94a80a832777f0e639f6a81fcfe169bf970a8c0"
112
+#define SQLITE_SOURCE_ID "2011-10-15 00:16:30 39408702a989f907261c298bf0947f3e68bd10fe"
113113
114114
/*
115115
** CAPI3REF: Run-Time Library Version Numbers
116116
** KEYWORDS: sqlite3_version, sqlite3_sourceid
117117
**
@@ -2802,11 +2802,12 @@
28022802
** zSql string ends at either the first '\000' or '\u0000' character or
28032803
** the nByte-th byte, whichever comes first. If the caller knows
28042804
** that the supplied string is nul-terminated, then there is a small
28052805
** performance advantage to be gained by passing an nByte parameter that
28062806
** is equal to the number of bytes in the input string <i>including</i>
2807
-** the nul-terminator bytes.
2807
+** the nul-terminator bytes as this saves SQLite from having to
2808
+** make a copy of the input string.
28082809
**
28092810
** ^If pzTail is not NULL then *pzTail is made to point to the first byte
28102811
** past the end of the first SQL statement in zSql. These routines only
28112812
** compile the first statement in zSql, so *pzTail is left pointing to
28122813
** what remains uncompiled.
@@ -3023,10 +3024,17 @@
30233024
** ^(In those routines that have a fourth argument, its value is the
30243025
** number of bytes in the parameter. To be clear: the value is the
30253026
** number of <u>bytes</u> in the value, not the number of characters.)^
30263027
** ^If the fourth parameter is negative, the length of the string is
30273028
** the number of bytes up to the first zero terminator.
3029
+** If a non-negative fourth parameter is provided to sqlite3_bind_text()
3030
+** or sqlite3_bind_text16() then that parameter must be the byte offset
3031
+** where the NUL terminator would occur assuming the string were NUL
3032
+** terminated. If any NUL characters occur at byte offsets less than
3033
+** the value of the fourth parameter then the resulting string value will
3034
+** contain embedded NULs. The result of expressions involving strings
3035
+** with embedded NULs is undefined.
30283036
**
30293037
** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
30303038
** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
30313039
** string after SQLite has finished with it. ^The destructor is called
30323040
** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(),
@@ -4041,11 +4049,16 @@
40414049
** is negative, then SQLite takes result text from the 2nd parameter
40424050
** through the first zero character.
40434051
** ^If the 3rd parameter to the sqlite3_result_text* interfaces
40444052
** is non-negative, then as many bytes (not characters) of the text
40454053
** pointed to by the 2nd parameter are taken as the application-defined
4046
-** function result.
4054
+** function result. If the 3rd parameter is non-negative, then it
4055
+** must be the byte offset into the string where the NUL terminator would
4056
+** appear if the string where NUL terminated. If any NUL characters occur
4057
+** in the string at a byte offset that is less than the value of the 3rd
4058
+** parameter, then the resulting string will contain embedded NULs and the
4059
+** result of expressions operating on strings with embedded NULs is undefined.
40474060
** ^If the 4th parameter to the sqlite3_result_text* interfaces
40484061
** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that
40494062
** function as the destructor on the text or BLOB result when it has
40504063
** finished using that result.
40514064
** ^If the 4th parameter to the sqlite3_result_text* interfaces or to
40524065
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -107,11 +107,11 @@
107 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
108 ** [sqlite_version()] and [sqlite_source_id()].
109 */
110 #define SQLITE_VERSION "3.7.9"
111 #define SQLITE_VERSION_NUMBER 3007009
112 #define SQLITE_SOURCE_ID "2011-10-11 20:41:54 b94a80a832777f0e639f6a81fcfe169bf970a8c0"
113
114 /*
115 ** CAPI3REF: Run-Time Library Version Numbers
116 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
117 **
@@ -2802,11 +2802,12 @@
2802 ** zSql string ends at either the first '\000' or '\u0000' character or
2803 ** the nByte-th byte, whichever comes first. If the caller knows
2804 ** that the supplied string is nul-terminated, then there is a small
2805 ** performance advantage to be gained by passing an nByte parameter that
2806 ** is equal to the number of bytes in the input string <i>including</i>
2807 ** the nul-terminator bytes.
 
2808 **
2809 ** ^If pzTail is not NULL then *pzTail is made to point to the first byte
2810 ** past the end of the first SQL statement in zSql. These routines only
2811 ** compile the first statement in zSql, so *pzTail is left pointing to
2812 ** what remains uncompiled.
@@ -3023,10 +3024,17 @@
3023 ** ^(In those routines that have a fourth argument, its value is the
3024 ** number of bytes in the parameter. To be clear: the value is the
3025 ** number of <u>bytes</u> in the value, not the number of characters.)^
3026 ** ^If the fourth parameter is negative, the length of the string is
3027 ** the number of bytes up to the first zero terminator.
 
 
 
 
 
 
 
3028 **
3029 ** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
3030 ** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
3031 ** string after SQLite has finished with it. ^The destructor is called
3032 ** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(),
@@ -4041,11 +4049,16 @@
4041 ** is negative, then SQLite takes result text from the 2nd parameter
4042 ** through the first zero character.
4043 ** ^If the 3rd parameter to the sqlite3_result_text* interfaces
4044 ** is non-negative, then as many bytes (not characters) of the text
4045 ** pointed to by the 2nd parameter are taken as the application-defined
4046 ** function result.
 
 
 
 
 
4047 ** ^If the 4th parameter to the sqlite3_result_text* interfaces
4048 ** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that
4049 ** function as the destructor on the text or BLOB result when it has
4050 ** finished using that result.
4051 ** ^If the 4th parameter to the sqlite3_result_text* interfaces or to
4052
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -107,11 +107,11 @@
107 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
108 ** [sqlite_version()] and [sqlite_source_id()].
109 */
110 #define SQLITE_VERSION "3.7.9"
111 #define SQLITE_VERSION_NUMBER 3007009
112 #define SQLITE_SOURCE_ID "2011-10-15 00:16:30 39408702a989f907261c298bf0947f3e68bd10fe"
113
114 /*
115 ** CAPI3REF: Run-Time Library Version Numbers
116 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
117 **
@@ -2802,11 +2802,12 @@
2802 ** zSql string ends at either the first '\000' or '\u0000' character or
2803 ** the nByte-th byte, whichever comes first. If the caller knows
2804 ** that the supplied string is nul-terminated, then there is a small
2805 ** performance advantage to be gained by passing an nByte parameter that
2806 ** is equal to the number of bytes in the input string <i>including</i>
2807 ** the nul-terminator bytes as this saves SQLite from having to
2808 ** make a copy of the input string.
2809 **
2810 ** ^If pzTail is not NULL then *pzTail is made to point to the first byte
2811 ** past the end of the first SQL statement in zSql. These routines only
2812 ** compile the first statement in zSql, so *pzTail is left pointing to
2813 ** what remains uncompiled.
@@ -3023,10 +3024,17 @@
3024 ** ^(In those routines that have a fourth argument, its value is the
3025 ** number of bytes in the parameter. To be clear: the value is the
3026 ** number of <u>bytes</u> in the value, not the number of characters.)^
3027 ** ^If the fourth parameter is negative, the length of the string is
3028 ** the number of bytes up to the first zero terminator.
3029 ** If a non-negative fourth parameter is provided to sqlite3_bind_text()
3030 ** or sqlite3_bind_text16() then that parameter must be the byte offset
3031 ** where the NUL terminator would occur assuming the string were NUL
3032 ** terminated. If any NUL characters occur at byte offsets less than
3033 ** the value of the fourth parameter then the resulting string value will
3034 ** contain embedded NULs. The result of expressions involving strings
3035 ** with embedded NULs is undefined.
3036 **
3037 ** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
3038 ** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
3039 ** string after SQLite has finished with it. ^The destructor is called
3040 ** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(),
@@ -4041,11 +4049,16 @@
4049 ** is negative, then SQLite takes result text from the 2nd parameter
4050 ** through the first zero character.
4051 ** ^If the 3rd parameter to the sqlite3_result_text* interfaces
4052 ** is non-negative, then as many bytes (not characters) of the text
4053 ** pointed to by the 2nd parameter are taken as the application-defined
4054 ** function result. If the 3rd parameter is non-negative, then it
4055 ** must be the byte offset into the string where the NUL terminator would
4056 ** appear if the string where NUL terminated. If any NUL characters occur
4057 ** in the string at a byte offset that is less than the value of the 3rd
4058 ** parameter, then the resulting string will contain embedded NULs and the
4059 ** result of expressions operating on strings with embedded NULs is undefined.
4060 ** ^If the 4th parameter to the sqlite3_result_text* interfaces
4061 ** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that
4062 ** function as the destructor on the text or BLOB result when it has
4063 ** finished using that result.
4064 ** ^If the 4th parameter to the sqlite3_result_text* interfaces or to
4065
+6 -6
--- src/stash.c
+++ src/stash.c
@@ -482,11 +482,11 @@
482482
db_finalize(&q);
483483
if( n==0 ) fossil_print("empty stash\n");
484484
}else
485485
if( memcmp(zCmd, "drop", nCmd)==0 || memcmp(zCmd, "rm", nCmd)==0 ){
486486
int allFlag = find_option("all", 0, 0)!=0;
487
- if( g.argc>4 ) usage("stash apply STASHID");
487
+ if( g.argc>4 ) usage("apply STASHID");
488488
if( allFlag ){
489489
db_multi_exec("DELETE FROM stash; DELETE FROM stashfile;");
490490
}else{
491491
stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
492492
undo_begin();
@@ -494,30 +494,30 @@
494494
stash_drop(stashid);
495495
undo_finish();
496496
}
497497
}else
498498
if( memcmp(zCmd, "pop", nCmd)==0 ){
499
- if( g.argc>3 ) usage("stash pop");
499
+ if( g.argc>3 ) usage("pop");
500500
stashid = stash_get_id(0);
501501
undo_begin();
502502
stash_apply(stashid, 0);
503503
undo_save_stash(stashid);
504504
undo_finish();
505505
stash_drop(stashid);
506506
}else
507507
if( memcmp(zCmd, "apply", nCmd)==0 ){
508
- if( g.argc>4 ) usage("stash apply STASHID");
508
+ if( g.argc>4 ) usage("apply STASHID");
509509
stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
510510
undo_begin();
511511
stash_apply(stashid, 0);
512512
undo_finish();
513513
}else
514514
if( memcmp(zCmd, "goto", nCmd)==0 ){
515515
int nConflict;
516516
int vid;
517517
518
- if( g.argc>4 ) usage("stash apply STASHID");
518
+ if( g.argc>4 ) usage("apply STASHID");
519519
stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
520520
undo_begin();
521521
vid = db_int(0, "SELECT vid FROM stash WHERE stashid=%d", stashid);
522522
nConflict = update_to(vid);
523523
stash_apply(stashid, nConflict);
@@ -526,20 +526,20 @@
526526
stashid);
527527
undo_finish();
528528
}else
529529
if( memcmp(zCmd, "diff", nCmd)==0 ){
530530
const char *zDiffCmd = db_get("diff-command", 0);
531
- if( g.argc>4 ) usage("stash diff STASHID");
531
+ if( g.argc>4 ) usage("diff STASHID");
532532
stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
533533
stash_diff(stashid, zDiffCmd);
534534
}else
535535
if( memcmp(zCmd, "gdiff", nCmd)==0 ){
536536
const char *zDiffCmd = db_get("gdiff-command", 0);
537
- if( g.argc>4 ) usage("stash diff STASHID");
537
+ if( g.argc>4 ) usage("diff STASHID");
538538
stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
539539
stash_diff(stashid, zDiffCmd);
540540
}else
541541
{
542542
usage("SUBCOMMAND ARGS...");
543543
}
544544
db_end_transaction(0);
545545
}
546546
--- src/stash.c
+++ src/stash.c
@@ -482,11 +482,11 @@
482 db_finalize(&q);
483 if( n==0 ) fossil_print("empty stash\n");
484 }else
485 if( memcmp(zCmd, "drop", nCmd)==0 || memcmp(zCmd, "rm", nCmd)==0 ){
486 int allFlag = find_option("all", 0, 0)!=0;
487 if( g.argc>4 ) usage("stash apply STASHID");
488 if( allFlag ){
489 db_multi_exec("DELETE FROM stash; DELETE FROM stashfile;");
490 }else{
491 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
492 undo_begin();
@@ -494,30 +494,30 @@
494 stash_drop(stashid);
495 undo_finish();
496 }
497 }else
498 if( memcmp(zCmd, "pop", nCmd)==0 ){
499 if( g.argc>3 ) usage("stash pop");
500 stashid = stash_get_id(0);
501 undo_begin();
502 stash_apply(stashid, 0);
503 undo_save_stash(stashid);
504 undo_finish();
505 stash_drop(stashid);
506 }else
507 if( memcmp(zCmd, "apply", nCmd)==0 ){
508 if( g.argc>4 ) usage("stash apply STASHID");
509 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
510 undo_begin();
511 stash_apply(stashid, 0);
512 undo_finish();
513 }else
514 if( memcmp(zCmd, "goto", nCmd)==0 ){
515 int nConflict;
516 int vid;
517
518 if( g.argc>4 ) usage("stash apply STASHID");
519 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
520 undo_begin();
521 vid = db_int(0, "SELECT vid FROM stash WHERE stashid=%d", stashid);
522 nConflict = update_to(vid);
523 stash_apply(stashid, nConflict);
@@ -526,20 +526,20 @@
526 stashid);
527 undo_finish();
528 }else
529 if( memcmp(zCmd, "diff", nCmd)==0 ){
530 const char *zDiffCmd = db_get("diff-command", 0);
531 if( g.argc>4 ) usage("stash diff STASHID");
532 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
533 stash_diff(stashid, zDiffCmd);
534 }else
535 if( memcmp(zCmd, "gdiff", nCmd)==0 ){
536 const char *zDiffCmd = db_get("gdiff-command", 0);
537 if( g.argc>4 ) usage("stash diff STASHID");
538 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
539 stash_diff(stashid, zDiffCmd);
540 }else
541 {
542 usage("SUBCOMMAND ARGS...");
543 }
544 db_end_transaction(0);
545 }
546
--- src/stash.c
+++ src/stash.c
@@ -482,11 +482,11 @@
482 db_finalize(&q);
483 if( n==0 ) fossil_print("empty stash\n");
484 }else
485 if( memcmp(zCmd, "drop", nCmd)==0 || memcmp(zCmd, "rm", nCmd)==0 ){
486 int allFlag = find_option("all", 0, 0)!=0;
487 if( g.argc>4 ) usage("apply STASHID");
488 if( allFlag ){
489 db_multi_exec("DELETE FROM stash; DELETE FROM stashfile;");
490 }else{
491 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
492 undo_begin();
@@ -494,30 +494,30 @@
494 stash_drop(stashid);
495 undo_finish();
496 }
497 }else
498 if( memcmp(zCmd, "pop", nCmd)==0 ){
499 if( g.argc>3 ) usage("pop");
500 stashid = stash_get_id(0);
501 undo_begin();
502 stash_apply(stashid, 0);
503 undo_save_stash(stashid);
504 undo_finish();
505 stash_drop(stashid);
506 }else
507 if( memcmp(zCmd, "apply", nCmd)==0 ){
508 if( g.argc>4 ) usage("apply STASHID");
509 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
510 undo_begin();
511 stash_apply(stashid, 0);
512 undo_finish();
513 }else
514 if( memcmp(zCmd, "goto", nCmd)==0 ){
515 int nConflict;
516 int vid;
517
518 if( g.argc>4 ) usage("apply STASHID");
519 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
520 undo_begin();
521 vid = db_int(0, "SELECT vid FROM stash WHERE stashid=%d", stashid);
522 nConflict = update_to(vid);
523 stash_apply(stashid, nConflict);
@@ -526,20 +526,20 @@
526 stashid);
527 undo_finish();
528 }else
529 if( memcmp(zCmd, "diff", nCmd)==0 ){
530 const char *zDiffCmd = db_get("diff-command", 0);
531 if( g.argc>4 ) usage("diff STASHID");
532 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
533 stash_diff(stashid, zDiffCmd);
534 }else
535 if( memcmp(zCmd, "gdiff", nCmd)==0 ){
536 const char *zDiffCmd = db_get("gdiff-command", 0);
537 if( g.argc>4 ) usage("diff STASHID");
538 stashid = stash_get_id(g.argc==4 ? g.argv[3] : 0);
539 stash_diff(stashid, zDiffCmd);
540 }else
541 {
542 usage("SUBCOMMAND ARGS...");
543 }
544 db_end_transaction(0);
545 }
546
+14 -2
--- src/style.c
+++ src/style.c
@@ -803,14 +803,26 @@
803803
** WEBPAGE: test_env
804804
*/
805805
void page_test_env(void){
806806
char c;
807807
int i;
808
+ int showAll;
808809
char zCap[30];
809810
login_check_credentials();
810
- if( !g.perm.Admin && !g.perm.Setup ){ login_needed(); return; }
811
+ if( !g.perm.Admin && !g.perm.Setup && !db_get_boolean("test_env_enable",0) ){
812
+ login_needed();
813
+ return;
814
+ }
811815
style_header("Environment Test");
816
+ showAll = atoi(PD("showall","0"));
817
+ if( !showAll ){
818
+ style_submenu_element("Show Cookies", "Show Cookies",
819
+ "%s/test_env?showall=1", g.zTop);
820
+ }else{
821
+ style_submenu_element("Hide Cookies", "Hide Cookies",
822
+ "%s/test_env", g.zTop);
823
+ }
812824
#if !defined(_WIN32)
813825
@ uid=%d(getuid()), gid=%d(getgid())<br />
814826
#endif
815827
@ g.zBaseURL = %h(g.zBaseURL)<br />
816828
@ g.zTop = %h(g.zTop)<br />
@@ -820,12 +832,12 @@
820832
zCap[i] = 0;
821833
@ g.userUid = %d(g.userUid)<br />
822834
@ g.zLogin = %h(g.zLogin)<br />
823835
@ capabilities = %s(zCap)<br />
824836
@ <hr>
825
- cgi_print_all();
837
+ cgi_print_all(atoi(PD("showall","0")));
826838
if( g.perm.Setup ){
827839
const char *zRedir = P("redirect");
828840
if( zRedir ) cgi_redirect(zRedir);
829841
}
830842
style_footer();
831843
}
832844
--- src/style.c
+++ src/style.c
@@ -803,14 +803,26 @@
803 ** WEBPAGE: test_env
804 */
805 void page_test_env(void){
806 char c;
807 int i;
 
808 char zCap[30];
809 login_check_credentials();
810 if( !g.perm.Admin && !g.perm.Setup ){ login_needed(); return; }
 
 
 
811 style_header("Environment Test");
 
 
 
 
 
 
 
 
812 #if !defined(_WIN32)
813 @ uid=%d(getuid()), gid=%d(getgid())<br />
814 #endif
815 @ g.zBaseURL = %h(g.zBaseURL)<br />
816 @ g.zTop = %h(g.zTop)<br />
@@ -820,12 +832,12 @@
820 zCap[i] = 0;
821 @ g.userUid = %d(g.userUid)<br />
822 @ g.zLogin = %h(g.zLogin)<br />
823 @ capabilities = %s(zCap)<br />
824 @ <hr>
825 cgi_print_all();
826 if( g.perm.Setup ){
827 const char *zRedir = P("redirect");
828 if( zRedir ) cgi_redirect(zRedir);
829 }
830 style_footer();
831 }
832
--- src/style.c
+++ src/style.c
@@ -803,14 +803,26 @@
803 ** WEBPAGE: test_env
804 */
805 void page_test_env(void){
806 char c;
807 int i;
808 int showAll;
809 char zCap[30];
810 login_check_credentials();
811 if( !g.perm.Admin && !g.perm.Setup && !db_get_boolean("test_env_enable",0) ){
812 login_needed();
813 return;
814 }
815 style_header("Environment Test");
816 showAll = atoi(PD("showall","0"));
817 if( !showAll ){
818 style_submenu_element("Show Cookies", "Show Cookies",
819 "%s/test_env?showall=1", g.zTop);
820 }else{
821 style_submenu_element("Hide Cookies", "Hide Cookies",
822 "%s/test_env", g.zTop);
823 }
824 #if !defined(_WIN32)
825 @ uid=%d(getuid()), gid=%d(getgid())<br />
826 #endif
827 @ g.zBaseURL = %h(g.zBaseURL)<br />
828 @ g.zTop = %h(g.zTop)<br />
@@ -820,12 +832,12 @@
832 zCap[i] = 0;
833 @ g.userUid = %d(g.userUid)<br />
834 @ g.zLogin = %h(g.zLogin)<br />
835 @ capabilities = %s(zCap)<br />
836 @ <hr>
837 cgi_print_all(atoi(PD("showall","0")));
838 if( g.perm.Setup ){
839 const char *zRedir = P("redirect");
840 if( zRedir ) cgi_redirect(zRedir);
841 }
842 style_footer();
843 }
844
--- www/fossil-v-git.wiki
+++ www/fossil-v-git.wiki
@@ -19,11 +19,11 @@
1919
<blockquote><center><table border=1 cellpadding=5>
2020
<tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr>
2121
<tr><td>File versioning only</td>
2222
<td>Versioning, Tickets, Wiki, and Blog/News</td></tr>
2323
<tr><td>Sharding</td><td>Replicating</td></tr>
24
-<tr><td>Huge community</td><td>Road less traveled</td></tr>
24
+<tr><td>Developer branches</td><td>Feature branches</td></tr>
2525
<tr><td>Complex</td><td>Intuitive</td></tr>
2626
<tr><td>Separate web tools</td><td>Integrated Web interface</td></tr>
2727
<tr><td>Lots of little tools</td><td>Single executable</td></tr>
2828
<tr><td>Pile-of-files repository</td><td>Single file repository</td></tr>
2929
<tr><td>Uses "<tt>rebase</tt>"</td><td>Immutable</td></tr>
@@ -79,38 +79,49 @@
7979
The [concepts.wiki#workflow | autosync] mode of Fossil makes it easy
8080
for multiple developers to work on a single branch and maintain
8181
linear development on that branch and avoid needless forking
8282
and merging.
8383
84
-<h3>3.3 Community</h3>
85
-
86
-Git has a huge user community. If following the herd and being
87
-like everybody else is important to you, then you should choose Git.
88
-
89
-Fossil is clearly the "road less traveled":
90
-
91
-<blockquote>
92
-Two roads diverged in a wood, and I &#151;<br>
93
-I took the one less traveled by,<br>
94
-And that has made all the difference.<br>
95
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
96
-<small>- Robert Frost, <i>The Road Not Taken</i>, 1916</small>
97
-</blockquote>
98
-</i></blockquote>
99
-
100
-Among the advantages of Git's huge user community are that new team
101
-members may already be familiar with Git's operation and hence can
102
-bypass the VCS learning curve. Also, if you need an add-on tool or
103
-script of some kind, a Google search will likely turn up a suitable
104
-tool that you can just download and use. A huge community also means
105
-that somebody else has likely already encountered and fixed the bugs
106
-so that Git will work for you and your project as advertised.
107
-
108
-Among the advantages of the "road less traveled" is that your particular
109
-project will be bigger percentage of the total user base, and is thus
110
-more likely to receive personal attention from the Fossil maintainers
111
-if you do encounter problems.
84
+<h3>3.3 Branches</h3>
85
+
86
+Git (and especially GitHub) encourages a workflow where each developer
87
+has his or her own branch or branches. Developers then send "pull requests"
88
+to have their changes be merged into "official" branches by integrators.
89
+For example, the Linux kernel team has a hierarchy of integrators with
90
+Linus Torvalds at the root. Individual developers each have their own
91
+private branches of the source tree into which they make their own changes.
92
+They then encourage first-tier integrators to pull those changes. The
93
+first-tier integrators merge together changes from multiple contributors
94
+then try to get second-tier integrators to pull their branches. The
95
+changes merge up the the hierarchy until (hopefully) they are pulled into
96
+"Linus's branch", at which time they become part of the "official" Linux.
97
+
98
+In Git, each branch is "owned" by the person who creates it and works
99
+on it. The owner might pull changes from others, but the owner is always
100
+in control of the branch. Branches are developer-centric.
101
+
102
+Fossil, on the other hand, encourages a workflow where branches are
103
+associated with features or releases, not individual developers.
104
+All developers share all branches in common, and two
105
+or more developers can and often do intersperse commits onto the same branch.
106
+Branches do not belong to individuals. All branches are read/write
107
+accessible to all developers at all times. There is no need
108
+for integrators to merge together changes from various independent
109
+developers. Instead, all of the developers work together cooperatively
110
+and the changes stay integrated naturally.
111
+
112
+So to a first approximation, branches in Git are developer-centric whereas
113
+branches in Fossil are feature-centric.
114
+
115
+The Git approach scales much better for large projects like the Linux
116
+kernel with thousands of contributors who in many cases don't even know
117
+each others names. The integrators serve a gatekeeper role to help keep
118
+undesirable code out of the official Linux source tree. On the other hand,
119
+not many projects are as big or as loosely organized as the Linux kernel.
120
+Most project, have a small team of developers who all know each other
121
+well and trust each other, and who enjoy working together collaboratively
122
+without the overhead and hierarchy of integrators.
112123
113124
<h3>3.4 Complexity</h3>
114125
115126
Git is a complex system. It can be tricky to use and requires a fair
116127
amount of knowledge and experience to master. Fossil strives to be
117128
--- www/fossil-v-git.wiki
+++ www/fossil-v-git.wiki
@@ -19,11 +19,11 @@
19 <blockquote><center><table border=1 cellpadding=5>
20 <tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr>
21 <tr><td>File versioning only</td>
22 <td>Versioning, Tickets, Wiki, and Blog/News</td></tr>
23 <tr><td>Sharding</td><td>Replicating</td></tr>
24 <tr><td>Huge community</td><td>Road less traveled</td></tr>
25 <tr><td>Complex</td><td>Intuitive</td></tr>
26 <tr><td>Separate web tools</td><td>Integrated Web interface</td></tr>
27 <tr><td>Lots of little tools</td><td>Single executable</td></tr>
28 <tr><td>Pile-of-files repository</td><td>Single file repository</td></tr>
29 <tr><td>Uses "<tt>rebase</tt>"</td><td>Immutable</td></tr>
@@ -79,38 +79,49 @@
79 The [concepts.wiki#workflow | autosync] mode of Fossil makes it easy
80 for multiple developers to work on a single branch and maintain
81 linear development on that branch and avoid needless forking
82 and merging.
83
84 <h3>3.3 Community</h3>
85
86 Git has a huge user community. If following the herd and being
87 like everybody else is important to you, then you should choose Git.
88
89 Fossil is clearly the "road less traveled":
90
91 <blockquote>
92 Two roads diverged in a wood, and I &#151;<br>
93 I took the one less traveled by,<br>
94 And that has made all the difference.<br>
95 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
96 <small>- Robert Frost, <i>The Road Not Taken</i>, 1916</small>
97 </blockquote>
98 </i></blockquote>
99
100 Among the advantages of Git's huge user community are that new team
101 members may already be familiar with Git's operation and hence can
102 bypass the VCS learning curve. Also, if you need an add-on tool or
103 script of some kind, a Google search will likely turn up a suitable
104 tool that you can just download and use. A huge community also means
105 that somebody else has likely already encountered and fixed the bugs
106 so that Git will work for you and your project as advertised.
107
108 Among the advantages of the "road less traveled" is that your particular
109 project will be bigger percentage of the total user base, and is thus
110 more likely to receive personal attention from the Fossil maintainers
111 if you do encounter problems.
 
 
 
 
 
 
 
 
 
 
 
112
113 <h3>3.4 Complexity</h3>
114
115 Git is a complex system. It can be tricky to use and requires a fair
116 amount of knowledge and experience to master. Fossil strives to be
117
--- www/fossil-v-git.wiki
+++ www/fossil-v-git.wiki
@@ -19,11 +19,11 @@
19 <blockquote><center><table border=1 cellpadding=5>
20 <tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr>
21 <tr><td>File versioning only</td>
22 <td>Versioning, Tickets, Wiki, and Blog/News</td></tr>
23 <tr><td>Sharding</td><td>Replicating</td></tr>
24 <tr><td>Developer branches</td><td>Feature branches</td></tr>
25 <tr><td>Complex</td><td>Intuitive</td></tr>
26 <tr><td>Separate web tools</td><td>Integrated Web interface</td></tr>
27 <tr><td>Lots of little tools</td><td>Single executable</td></tr>
28 <tr><td>Pile-of-files repository</td><td>Single file repository</td></tr>
29 <tr><td>Uses "<tt>rebase</tt>"</td><td>Immutable</td></tr>
@@ -79,38 +79,49 @@
79 The [concepts.wiki#workflow | autosync] mode of Fossil makes it easy
80 for multiple developers to work on a single branch and maintain
81 linear development on that branch and avoid needless forking
82 and merging.
83
84 <h3>3.3 Branches</h3>
85
86 Git (and especially GitHub) encourages a workflow where each developer
87 has his or her own branch or branches. Developers then send "pull requests"
88 to have their changes be merged into "official" branches by integrators.
89 For example, the Linux kernel team has a hierarchy of integrators with
90 Linus Torvalds at the root. Individual developers each have their own
91 private branches of the source tree into which they make their own changes.
92 They then encourage first-tier integrators to pull those changes. The
93 first-tier integrators merge together changes from multiple contributors
94 then try to get second-tier integrators to pull their branches. The
95 changes merge up the the hierarchy until (hopefully) they are pulled into
96 "Linus's branch", at which time they become part of the "official" Linux.
97
98 In Git, each branch is "owned" by the person who creates it and works
99 on it. The owner might pull changes from others, but the owner is always
100 in control of the branch. Branches are developer-centric.
101
102 Fossil, on the other hand, encourages a workflow where branches are
103 associated with features or releases, not individual developers.
104 All developers share all branches in common, and two
105 or more developers can and often do intersperse commits onto the same branch.
106 Branches do not belong to individuals. All branches are read/write
107 accessible to all developers at all times. There is no need
108 for integrators to merge together changes from various independent
109 developers. Instead, all of the developers work together cooperatively
110 and the changes stay integrated naturally.
111
112 So to a first approximation, branches in Git are developer-centric whereas
113 branches in Fossil are feature-centric.
114
115 The Git approach scales much better for large projects like the Linux
116 kernel with thousands of contributors who in many cases don't even know
117 each others names. The integrators serve a gatekeeper role to help keep
118 undesirable code out of the official Linux source tree. On the other hand,
119 not many projects are as big or as loosely organized as the Linux kernel.
120 Most project, have a small team of developers who all know each other
121 well and trust each other, and who enjoy working together collaboratively
122 without the overhead and hierarchy of integrators.
123
124 <h3>3.4 Complexity</h3>
125
126 Git is a complex system. It can be tricky to use and requires a fair
127 amount of knowledge and experience to master. Fossil strives to be
128

Keyboard Shortcuts

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